关于xsl:for-each循环中的xml:Counter

关于xsl:for-each循环中的xml:Counter

Counter inside xsl:for-each loop

如何在xsl:for-each循环中获取一个计数器,该计数器将反映当前已处理元素的数量。
例如,我的源XML是

1
2
3
4
5
6
7
8
9
10
11
<books>
    <book>
        The Unbearable Lightness of Being
    </book>
    <book>
        Narcissus and Goldmund
    </book>
    <book>
        Choke
    </book>
</books>

我想要得到的是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<newBooks>
    <newBook>
        <countNo>1</countNo>
        The Unbearable Lightness of Being
    </newBook>
    <newBook>
        <countNo>2</countNo>
        Narcissus and Goldmund
    </newBook>
    <newBook>
        <countNo>3</countNo>
        Choke
    </newBook>
</newBooks>

XSLT进行修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <newBooks>
            <xsl:for-each select="books/book">
                <newBook>
                    <countNo>???</countNo>
                   
                        <xsl:value-of select="title"/>
                   
                </newBook>
            </xsl:for-each>
        </newBooks>
    </xsl:template>
</xsl:stylesheet>

因此,问题是用什么代替???。 是否有任何标准关键字,还是我必须简单地声明一个变量并在循环内对其递增?

由于问题很长,我可能应该期待一行或一个单词的答案:)


position()。 例如。:

1
<countNo><xsl:value-of select="position()" /></countNo>

尝试在???位置插入

注意" 1"-这是数字格式。 更多信息:这里


尝试:

1
<xsl:value-of select="count(preceding-sibling::*) + 1" />

编辑-在那里冻结了大脑,position()更简单!


您还可以在Postion()上运行条件语句,这在许多情况下都非常有用。

例如

1
2
3
 <xsl:if test="(position( )) = 1">
     //Show header only once
    </xsl:if>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <newBooks>
                <xsl:for-each select="books/book">
                        <newBook>
                                <countNo><xsl:value-of select="position()"/></countNo>
                               
                                        <xsl:value-of select="title"/>
                               
                        </newBook>
                </xsl:for-each>
        </newBooks>
    </xsl:template>
</xsl:stylesheet>


推荐阅读