我的XSLT有什么问题?

时间:2012-10-18 01:25:22

标签: xml xslt

我想将XML转换为其他格式的XML,因此我使用了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 个答案:

答案 0 :(得分:2)

我打赌您正在使用Firefox,并且它试图将其呈现为HTML,这意味着它删除了它无法理解的标签。 尝试右键单击页面并查看源并查看页面源是否正确。

答案 1 :(得分: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 :(得分: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>