Comment obtenir un compteur dans xsl: for-each loop qui refléterait le nombre d'éléments en cours traités.
Par exemple, mon code source XML est
<books>
<book>
<title>The Unbearable Lightness of Being </title>
</book>
<book>
<title>Narcissus and Goldmund</title>
</book>
<book>
<title>Choke</title>
</book>
</books>
Ce que je veux obtenir, c'est:
<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>
Le XSLT à modifier:
<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>
La question est donc de savoir quoi mettre en place ???. Existe-t-il un mot clé standard ou dois-je simplement déclarer une variable et l'incrémenter dans la boucle?
Comme la question est assez longue, je devrais probablement m'attendre à une réponse en ligne ou en Word :)
position()
. PAR EXEMPLE.:
<countNo><xsl:value-of select="position()" /></countNo>
Essayez d'insérer <xsl:number format="1. "/><xsl:value-of select="."/><xsl:text>
à la place de ???.
Notez le "1" - c'est le format de nombre. Plus d'infos: ici
Essayer:
<xsl:value-of select="count(preceding-sibling::*) + 1" />
Edit - Si le cerveau était gelé, position () est plus simple!
Vous pouvez également exécuter des instructions conditionnelles sur Position (), ce qui peut s'avérer très utile dans de nombreux scénarios.
pour par exemple.
<xsl:if test="(position( )) = 1">
//Show header only once
</xsl:if>
<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>