对具有相同名称的节点的xml进行XSLT转换

时间:2013-11-20 14:56:15

标签: xml xslt

我有这种格式的XML,

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
    <title>Empire Burlesque</title>
    <title>Hide your heart</title>
    <title>Greatest Hits</title>
    <title>Still got the blues</title>
    <title>Eros</title>
    <title>One night only</title>
</cd>
</catalog>

此XML的XSLT是

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
      <body>
        <table border="1">
          <tr>
            <th>Title</th>
          </tr>
          <xsl:for-each select="catalog/cd/title">
          <tr>
            <td><xsl:value-of select="title"/></td>
          </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
</xsl:template>
</xsl:stylesheet>

我希望输出看起来像,

标题

Empire Burlesque
隐藏你的心 最伟大的命中
仍然有蓝调
爱神
仅限一晚

当我尝试转换上面的XML时,我得到一个空表,但没有标题。请帮助我,这样我就可以得到如上所示的预期输出。 提前谢谢。

1 个答案:

答案 0 :(得分:4)

您的解决方案只存在一个小缺陷。请参阅以下代码中的我的评论:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
      <body>
        <table border="1">
          <tr>
            <th>Title</th>
          </tr>
          <xsl:for-each select="catalog/cd/title">
          <tr>
            <!-- you have to reference '.' instead of 'title' because this is the
              current context node since you iterate over 'title' elements with
              for-each -->
            <td><xsl:value-of select="."/></td>
          </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
</xsl:template>
</xsl:stylesheet>