1

而且缩进也不起作用!

我需要从小文件生成 XML 文件,所以我尝试使用 XSL 合并所有文件,但它没有按预期工作。

当所有文件上传到站点时查看“devices.xml”时:

  • FireFox - 显示为文本
  • InternetExplorer - 显示为文本
  • Chrome - 显示为文本

当我使用“文件|另存为”时 -

  • FireFox - 保存生成的 XML - myRoot-device-input1- 。. .
  • InternetExplorer - 保存原始 XML - device_list-file。. .
  • Chrome - 保存原始 XML - device_list-file 。. .

将“devices.xml”作为本地文件查看时:

  • FireFox - 显示为文本
  • InternetExplorer - “访问被拒绝。错误处理资源”
  • Chrome - 显示空白页???

我的问题:

  1. 为什么我将生成的 XML 视为文本?
  2. 我可以强制所有浏览器保存生成的 XML 而不是原始 XML?

源文件:

设备.xml

<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="./mergedocs.xsl" ?>
<device_list> 
 <file name="./device1.xml" />
 <file name="./device2.xml" />
</device_list>

设备1.xml

<d>
<i1 v="11" />
<i2 v="11" />
</d>

设备2.xml

<d>
<i1 v="22" />
<i2 v="22" />
</d>

探针1.xml

<p name="probes1">
  <Item>"1 Name Pb1"</Item>
  <Item>"2 Name Pb1"</Item>
</p>

探针2.xml

<p name="probes2">
  <Item>"1 Name Pb2"</Item>
  <Item>"2 Name Pb2"</Item>
</p>

合并文档.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />

<xsl:variable name="probes1" select="document('probes1.xml')" />
<xsl:variable name="probes2" select="document('probes2.xml')" />

<xsl:template match="/">
  <myRoot> 
    <xsl:for-each select="/device_list/file">
      <device>
        <xsl:variable name="k" select="position()" />
        <xsl:apply-templates select="document(@name)/d" >
          <xsl:with-param name="strK" select="$k"/> 
        </xsl:apply-templates>
      </device>     
    </xsl:for-each>
  </myRoot> 
</xsl:template>

<xsl:template match="d">
  <xsl:param name="strK" />    
  <xsl:apply-templates >
    <xsl:with-param name="strK" select="$strK"/> 
  </xsl:apply-templates >
</xsl:template>

<xsl:template match="i1">
 <xsl:param name="strK" />    
 <input1>
   <name><xsl:value-of select="$probes1//Item[position() = $strK]"/></name>
   <value><xsl:value-of select="@v" /></value>
 </input1>
</xsl:template>

<xsl:template match="i2">
 <xsl:param name="strK" />    
 <input2>
   <name><xsl:value-of select="$probes2//Item[position() = $strK]"/></name>
   <value><xsl:value-of select="@v" /></value>
 </input2>
</xsl:template>

</xsl:stylesheet>
4

1 回答 1

3

内置在浏览器中的 XSLT 处理器,尤其是在使用 xml-stylesheet PI 调用时,假定您正在生成 HTML,并像显示 HTML 一样显示结果。这基本上意味着忽略所有在 HTML 中没有意义的标签,所以你只得到文本。

从您要实现的目标的描述中,我不清楚您为什么要尝试在浏览器中运行它。使用可以从命令行或 GUI 运行的 XSLT 处理器会好得多。

于 2013-05-22T11:29:10.567 回答