如何在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> |