2013-05-22 109 views
1

並且縮進也不起作用!XSL輸出顯示爲文本而不是顯示爲XML

我需要從小文件生成XML文件,所以我嘗試使用XSL來合併所有文件,但它不能按預期方式工作。

當觀看 「devices.xml」 當所有文件上傳到一個網站:

  • 火狐 - 顯示爲文本
  • 的InternetExplorer - 顯示爲文本
  • 瀏覽器 - 顯示爲文本

當我使用「文件|另存爲」 -

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

當觀看 「devices.xml」 本地文件:

  • 火狐 - 顯示爲文本
  • 的InternetExplorer - 「訪問被拒絕錯誤處理資源」
  • 鉻 - 顯示空白頁???

我的問題:

  1. 爲什麼我看到生成的XML爲文本?
  2. 我可以強制所有瀏覽器保存生成的XML而不是原始的XML嗎?

源文件:

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> 

回答

3

內置在瀏覽器中的XSLT處理器,尤其是當使用XML樣式表PI,假設你生成HTML,並顯示結果就好像它是HTML調用。這基本上意味着忽略所有在HTML中沒有意義的標籤,所以你最終只能看到文本。

從你想要實現什麼的描述中,我不清楚你爲什麼試圖在瀏覽器中運行它。使用可以從命令行或GUI運行的XSLT處理器會更好。

+0

謝謝。我可以在Web上使用XML文件的本地XSLT處理器嗎?例如使用 - [msxsl.exe www.mySite.com \ devices.xml。\ mergedocs.xsl -o。\ output \ merged.xml] 與 - 相同[msxsl.exe。\ devices.xml mergedocs.xsl - o。\ output \ merged.xml] – Atara

+0

我測試過了,它工作正常。謝謝。 – Atara

+0

當然,一旦您在本地機器上運行XSLT,您將不再受XSLT 1.0或像MSXML3這樣的古老處理器的約束。 –