我的xslt没有产生正确的输出?

时间:2011-01-04 06:18:31

标签: xml xslt

我的XML是'input.xsl'

      <?xml version="1.0" encoding="ISO-8859-1"?>
     <?xml-stylesheet type="text/xsl" href="input.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>
       </catalog>

现在我想在XSLT的帮助下使用上面的XML文件生成另一个XML文档,如下所示,(OUTPUT格式)

        <?xml version="1.0" encoding="ISO-8859-1"?>
        <catalog>
        <cd>
       <title>Empire Burlesque</title>
       <artist>Bob Dylan</artist>
        </cd>
        <cd>
       <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        </cd>
          </catalog>

为此我创建了xsl文件'input.xsl'

  <?xml version="1.0" encoding="ISO-8859-1"?>
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8"/>

    <xsl:template match="/">
        <xsl:element name="catalog">
            <xsl:apply-templates select="catalog/cd/title"/> <br/>
            <xsl:apply-templates select="catalog/cd/artist"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="catalog/cd/artist">
        <xsl:element name="cd">
            <xsl:value-of select="current()"/> 
        </xsl:element>
    </xsl:template>

    <xsl:template match="catalog/cd/title">
        <xsl:element name="cd">
            <xsl:value-of select="current()"/> 
        </xsl:element>
    </xsl:template>
  </xsl:stylesheet>

上述xsl文件不会以xml格式生成输出。那我的代码有什么问题呢。引导我。提前谢谢。

3 个答案:

答案 0 :(得分:1)

您正在使用调用的select子句中要匹配的路径。请记住,当每个节点匹配时,它将成为当前节点,从该节点评估任何后续相对XPath表达式。此外,您不需要一直构建元素 - 只需将'样板'XML放在您想要的位置即可。

我建议改为:

<xsl:template match="/">
    <catalog><xsl:apply-templates /></catalog>
</xsl:template>

<xsl:template match="cd">
     <cd><xsl:apply-templates /></cd>
</xsl:template>

<xsl:template match="artist">
    <artist><xsl:value-of select="text()" /></artist>
</xsl:template>

<xsl:template match="title">
    <title><xsl:value-of select="text()" /></title>
</xsl:template>

我不记得text()是否正确,但这可能会让你朝着正确的方向前进。

答案 1 :(得分:1)

实际上,我认为您不需要所有模板匹配。这似乎使其变得更加困难,因为每次都有不同的背景。

我只是匹配根,并在cd元素上执行for-each。 看起来这么简单,我想你只会从阅读中理解; - )

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8"/>

    <xsl:template match="/">
        <catalog>
            <xsl:for-each select="catalog/cd">
                <cd>
                    <title><xsl:value-of select="title"/></title>
                    <artist><xsl:value-of select="artist"/></artist>
                </cd>
            </xsl:for-each>
        </catalog>
    </xsl:template>
</xsl:stylesheet>

答案 2 :(得分:1)

另一种方法,利用身份转换模式。

<?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" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="country | company | price | year | processing-instruction()"/>

</xsl:stylesheet>

应用于示例XML,产生了正确的结果:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
    </cd>
    <cd>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
    </cd>
</catalog>