2008-09-18 12 views
80

Comment obtenir un compteur à l'intérieur de xsl: pour chaque boucle qui refléterait le nombre d'éléments en cours traités.
Par exemple, mon XML source estCompteur à l'intérieur de xsl: pour chaque boucle

<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 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 ACTUALISATION:

<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 ce qu'il faut mettre en place de ??? Y at-il un mot-clé standard ou dois-je simplement déclarer une variable et l'incrémenter dans la boucle?

La question est assez longue, je devrais probablement attendre une ligne ou un mot réponse :)

Répondre

130

position(). .: par exemple

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

+1

Besoin d'ajouter une citation de fermeture "à la valeur d'attribut –

+6

Ceci est bien beau jusqu'à ce que vous devez ajouter un filtre comme xsl: si l'intérieur de votre xsl:. For-each alors la position() est INUTILE et –

+2

@Mike Stavrov Ça ne faisait pas partie de la question! Impossible de couvrir toutes les situations – redsquare

5
<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> 
13

Essayez d'insérer <xsl:number format="1. "/><xsl:value-of select="."/><xsl:text> à la place de ???.

Notez le "1." - c'est le format numérique. Plus d'infos: here

+0

Merci, c'est une lecture intéressante aussi bien. J'utiliserai probablement cette approche quand un formatage est requis – kristof

+0

XSLT 1.0 version: '' – jsuddsjr

5

Essayez:

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

Modifier - avait un cerveau geler là, la position() est plus simple!

+1

pourrait être utile, surtout si vous choisissez en fonction de critères autres que position(). +1 – jsuddsjr

5

Vous pouvez également exécuter des instructions conditionnelles sur Postion(), ce qui peut s'avérer très utile dans de nombreux scénarios.

par ex.

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

Cela échoue si vous avez un filtre tel qu'un xsl: sort car le premier élément peut ne pas être le premier à être traité. –

Questions connexes