XSL输出显示为文本而不是显示为XML

时间:2013-05-22 08:36:05

标签: xml xslt

并且缩进也不起作用!

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

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

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

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

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

将“devices.xml”视为本地文件时:

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

我的问题:

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

    devices.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>
    

    device1.xml

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

    device2.xml

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

    probes1.xml

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

    probes2.xml

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

    mergedocs.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>
    

1 个答案:

答案 0 :(得分:3)

内置于浏览器的XSLT处理器,尤其是在使用xml-stylesheet PI调用时,假设您正在生成HTML,并将结果显示为HTML。这基本上意味着忽略HTML中没有任何意义的所有标签,因此您最终会得到文本。

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