在XSLT转换中使用position()

时间:2014-07-05 12:08:27

标签: xml xslt-1.0 xslt-2.0

我正在尝试转换以下XML

<?xml version="1.0" encoding="UTF-8"?>

<catalog>
    <cd QualifyingCode="1">
        <title>title1</title>
        <artist>artist1</artist>
    </cd>
    <cd QualifyingCode="1">
        <title>title2</title>
        <artist>artist2</artist>
    </cd>
    <cd QualifyingCode="2">
        <title>title3</title>
        <artist>artist3</artist>
    </cd>
    <cd QualifyingCode="2">
        <title>title4</title>
        <artist>artist4</artist>
    </cd>
</catalog>

使用floowing 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>
  <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th style="text-align:left">Title</th>
        <th style="text-align:left">Artist</th>
        <th style="text-align:left">ID</th>
      </tr>
      <xsl:for-each select="catalog/cd">
      <tr>
        <td><xsl:value-of select="title"/></td>
        <td><xsl:value-of select="artist"/></td>
        <td><xsl:value-of select="position()"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

我使用position()获得1,2,3,4的位置。我想要的是position()的输出应该是1,2,1,2,基于“QualifyingCode”属性。

所以我目前的输出是:

My CD Collection
Title   Artist  ID
title1  artist1 1
title2  artist2 2
title3  artist3 3
title4  artist4 4

我的预期输出是

 My CD Collection
    Title   Artist  ID
    title1  artist1 1
    title2  artist2 2
    title3  artist3 1
    title4  artist4 2

3 个答案:

答案 0 :(得分:2)

一种方法是使用

   <td><xsl:value-of select="count(preceding-sibling::cd[@QualifyingCode = current()/@QualifyingCode]) + 1"/></td>

答案 1 :(得分:1)

  

我想要的是position()的输出应该是1,2,1,2基于   “QualifyingCode”属性。

这不是一个足够明确的要求,而且这个例子也是模棱两可的。假设您希望在QualifyingCode属性更改时重新开始编号,则应使用xsl:number

<xsl:number from="cd[@QualifyingCode!=preceding-sibling::cd[1]/@QualifyingCode]" level="any" />

请注意, 与使用相同QualifyingCode计算前一个兄弟姐妹相同;如果将另一张带有@ QualifyingCode = 1的CD附加到当前列表,差异将变得明显。

答案 2 :(得分:0)

我对你的xslt进行了两次修改:一种是使用模板而不是每种模式更好。另一个通过统计具有相同QualifyingCode的兄弟姐妹来解决您的问题:

<?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>
  <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th style="text-align:left">Title</th>
        <th style="text-align:left">Artist</th>
        <th style="text-align:left">ID</th>
      </tr>
      <xsl:apply-templates select="catalog/cd"/>
    </table>
  </body>
  </html>
</xsl:template>

<xsl:template match="cd">
      <tr>
        <td><xsl:value-of select="title"/></td>
        <td><xsl:value-of select="artist"/></td>
        <td><xsl:value-of select="count(preceding-sibling::cd[@QualifyingCode = 
             current()/@QualifyingCode]) + 1"/></td>
      </tr>
</xsl:template>

</xsl:stylesheet>