2012-10-18 52 views
0

我想將XML轉換爲其他格式的XML,因此我使用了XSLT。但結果不好。我的XSLT有什麼問題?

XML:

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?> 
<catalog> 
    <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
     <country>USA</country> 
     <company>Columbia</company> 
     <price>10.90</price> 
     <year>1985</year> 
    </cd> 
    <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
     <country>UK</country> 
     <company>CBS Records</company> 
     <price>9.90</price> 
     <year>1988</year> 
    </cd> 
    <cd> 
     <title>Greatest Hits</title> 
     <artist>Dolly Parton</artist> 
     <country>USA</country> 
     <company>RCA</company> 
     <price>9.90</price> 
     <year>1982</year> 
    </cd> 
</catalog> 

XSLT

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8" indent="yes" /> 
<xsl:template match="/"> 
    <root> 
     <items> 
      <xsl:for-each select="catalog/cd"> 
       <item> 
        <xsl:value-of select="artist"/> 
       </item> 
      </xsl:for-each> 
     </items> 
    </root> 
</xsl:template> 
</xsl:stylesheet> 

結果我想(在瀏覽器):

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <items> 
     <item>Empire Burlesque</item> 
     <item>Hide your heart</item> 
     <item>Greatest Hits</item> 
    </items> 
</root> 

真實的結果(瀏覽器):

Empire Burlesque Hide your heart Greatest Hits 

什麼是錯的我的XSLT?

+3

你看過來源嗎?可能您的瀏覽器正在應用默認樣式表來格式化XML。 – Xint0

+1

根據你的實際代碼,我得到的是'Bob DylanBonnie TylerDolly Parton',因爲你對藝術家做了一個'foreach' – PatomaS

回答

2

您可以XSL改變你這一點:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8" indent="yes" /> 
<xsl:template match="/"> 
    <root> 
     <xsl:for-each select="catalog/cd"> 
      <items> 
       <item> 
        <xsl:value-of select="title"/> 
        <xsl:text xml:space="preserve">&#10;</xsl:text> 
       </item> 
      </items> 
     </xsl:for-each> 
    </root> 
</xsl:template> 
</xsl:stylesheet> 

這將在瀏覽器中產生這樣的:

Empire Burlesque 
Hide your heart 
Greatest Hits 

如果你點擊它,在Firefox,並選擇web developer > view source > view generated source你將得到這個:

<root><items><item>Empire Burlesque 
</item></items><items><item>Hide your heart 
</item></items><items><item>Greatest Hits 
</item></items></root> 

這就是你說你想要的。

請記住,在瀏覽器中,您將看到文本,所有不是html的標籤都將被丟棄。如果您檢查源代碼,您將看到xml文件,因爲這是您加載的內容。如果您檢查生成的源代碼是轉換告訴瀏覽器顯示的內容。

默認情況下,瀏覽器的渲染引擎,使用html,這就是爲什麼它忽略任何其他標籤。

再見

2

我會打賭你使用的是Firefox,它試圖將其呈現爲HTML,這意味着它將刪除它不理解的標籤。 嘗試右鍵單擊第頁並查看源代碼並查看頁面源是否正確。

1

看起來你對它在瀏覽器中的呈現方式感興趣。在這種情況下,也許這就是你想要的...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" encoding="utf-8" indent="yes" /> 
<xsl:template match="/"> 
    <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text> 
    <html> 
    <head> 
     <meta charset="utf-8" /> 
     <title>List of CDs</title> 
    </head> 
    <body> 
     <ul> 
     <xsl:for-each select="catalog/cd"> 
      <li><xsl:value-of select="artist"/></li> 
     </xsl:for-each> 
     </ul> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet>