2008-09-18 3 views
80

So erhalten Sie einen Zähler innerhalb von xsl: for-each, der die Anzahl der verarbeiteten Elemente widerspiegelt.
Zum Beispiel XML meine Quelle istZähler innerhalb von xsl: für jede Schleife

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

Was will ich erhalte, ist:

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

Die XSLT zu ändern:

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

So ist die Frage, was an Ort und Stelle zu setzen ist von ???. Gibt es ein Standard-Schlüsselwort oder muss ich einfach eine Variable deklarieren und innerhalb der Schleife erhöhen?

Da die Frage ziemlich lang ist, sollte ich wohl erwarten eine Zeile oder ein Wort Antwort :)

Antwort

130

position(). Z.B .:

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

Brauchen Sie noch einen Schlusskurs "auf den Attributwert hinzufügen –

+6

Das ist alles schön und gut, bis Sie einen Filter wie xsl hinzufügen: Wenn in Ihrem xsl:. For-each Dann Position() ist unnütz und Sie brauchen einen richtigen Zähler –

+2

@Mike Stavrov Das war nicht Teil der Frage! Kann nicht jede Situation abdecken – 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

Versuchen <xsl:number format="1. "/><xsl:value-of select="."/><xsl:text> an die Stelle ??? einsetzen.

Beachten Sie die "1." - das ist das Zahlenformat. Weitere Informationen: here

+0

Danke, das ist auch eine interessante Lektüre. Ich werde wahrscheinlich diesen Ansatz verwenden, wenn etwas Formatierung erforderlich ist – kristof

+0

XSLT 1.0 Version: '' – jsuddsjr

5

Versuchen:

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

bearbeiten - hatte ein Gehirn dort gefrieren, Position() ist einfacher!

+1

Still Dies kann nützlich sein, insbesondere wenn Sie andere Kriterien als position() auswählen. +1 – jsuddsjr

5

Sie können auch bedingte Anweisungen für die Position() ausführen, was in vielen Szenarien sehr hilfreich sein kann.

für zB.

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

Dies schlägt fehl, wenn Sie einen Filter wie xsl: sort haben, da dann möglicherweise das erste Element nicht als erstes verarbeitet wird. –