Xml 在XSLT转换中使用position()

Xml 在XSLT转换中使用position(),xml,xslt-1.0,xslt-2.0,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">

我正在尝试转换以下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>
我的预期产出是

 My CD Collection
    Title   Artist  ID
    title1  artist1 1
    title2  artist2 2
    title3  artist3 1
    title4  artist4 2
一种方法是使用

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

一种方法是使用

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

一种方法是使用

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

一种方法是使用

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

我对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>

我的CD收藏
标题
艺术家
身份证件

我对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>

我的CD收藏
标题
艺术家
身份证件

我对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>

我的CD收藏
标题
艺术家
身份证件

我对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>

我的CD收藏
标题
艺术家
身份证件
我想要的是position()的输出应该是1,2,1,2,基于 “QualifyingCode”属性

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

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

请注意,这与计算具有相同限定代码的前一个兄弟姐妹的数目不同;如果将另一张@QualifyingCode=1的cd附加到当前列表中,差异将变得明显

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

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

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

请注意,这与计算具有相同限定代码的前一个兄弟姐妹的数目不同;如果将另一张@QualifyingCode=1的cd附加到当前列表中,差异将变得明显

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

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

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

请注意,这与计算具有相同限定代码的前一个兄弟姐妹的数目不同;如果将另一张@QualifyingCode=1的cd附加到当前列表中,差异将变得明显

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

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

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


请注意,这与计算具有相同限定代码的前一个兄弟姐妹的数目不同;如果将另一张@QualifyingCode=1的cd附加到当前列表中,差异将变得明显

如果QualifyingCode的增量不为1,则此操作是否有效?假设我将QualifyingCode设为“25”和“8”,表达式
count(前面的同级:cd[@QualifyingCode=current()/@QualifyingCode])
统计前面的同级
cd
元素的数量,这些元素具有与上下文节点相同的
QualifyingCode
属性值(这是由一个
为每个
处理的
cd
元素,或者由一个模板匹配的元素)。因此,是的,假设您要计算具有相同值的元素,它会工作。如果QualifyingCode不是递增1,这会工作吗?假设我将QualifyingCode作为表达式
计数的“25”和“8”(前面的同级::cd)[@QualifyingCode=current()/@QualifyingCode])
统计前面的同级
cd
元素的数量,这些元素具有与上下文节点相同的
QualifyingCode
属性值(这是由
为每个
处理的
cd
元素或由模板匹配的元素)。因此,是的,假设您要计算具有相同值的元素,它会起作用。如果QualifyingCode不是递增1,这会起作用吗?假设我将QualifyingCode设置为“25”,并将表达式
计数设为“8”(前面的同级::cd[@QualifyingCode=current()/@QualifyingCode])
统计前面的同级
cd
元素的数量,这些元素具有与上下文节点相同的
QualifyingCode
属性值(这是由
为每个
处理的
cd
元素或由模板匹配的元素)。因此,是的,假设您要计算具有相同值的元素,它会起作用。如果QualifyingCode不是递增1,这会起作用吗?假设我将QualifyingCode设置为“25”和“8”。表达式
count(前面的同级::cd[@QualifyingCode=current()/@QualifyingCode])
计算数字