在xsl:for-each循环内计数器

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

<books> <book> <title>The Unbearable Lightness of Being </title> </book> <book> <title>Narcissus and Goldmund</title> </book> <book> <title>Choke</title> </book> </books> 

我想得到的是:

 <newBooks> <newBook> <countNo>1</countNo> <title>The Unbearable Lightness of Being </title> </newBook> <newBook> <countNo>2</countNo> <title>Narcissus and Goldmund</title> </newBook> <newBook> <countNo>3</countNo> <title>Choke</title> </newBook> </newBooks> 

XSLT修改:

 <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> <title> <xsl:value-of select="title"/> </title> </newBook> </xsl:for-each> </newBooks> </xsl:template> </xsl:stylesheet> 

所以问题是如何代替???。 有没有任何标准的关键字,或者我只是必须声明一个variables,并在循环内增加它?

由于问题是相当长的,我应该期望一行或一个单词回答:)

position() 。 例如:

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

尝试插入<xsl:number format="1. "/><xsl:value-of select="."/><xsl:text>

请注意“1.” – 这是数字格式。 更多信息: 在这里

  <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> <title> <xsl:value-of select="title"/> </title> </newBook> </xsl:for-each> </newBooks> </xsl:template> </xsl:stylesheet> 

尝试:

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

编辑 – 有一个大脑冻结在那里,位置()更直接!

您也可以在Postion()上运行条件语句,这在许多场景中确实有用。

例如。

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