2009-05-30 19 views
14

Ho due loop nidificati in XSL come questo, in questo momento uso position() ma non è quello che mi serve.indice in loop XSL

<xsl:for-each select="abc"> 
    <xsl:for-each select="def"> 
    I wanna my variable in here increasing fluently 1,2,3,4,5.....n 
not like 1,2,3,1,2,3 
    </xsl:for-each> 
</xsl:for-each> 

Mi potete dare qualche idea per questo stub. Grazie mille!

risposta

18

Con XSL, il problema è che non puoi cambiare una variabile (è più come una costante che si sta impostando). Quindi l'incremento di una variabile contatore non funziona.

Una maldestra soluzione per ottenere un conteggio sequenziale (1,2,3,4, ...) sarebbe chiamare la posizione() per ottenere l'iterazione di tag "abc" e un'altra chiamata a position() per ottenere l'iterazione del tag "def" nidificata. Dovresti quindi moltiplicare l'iterazione "abc" con il numero di tag "def" che contiene. Ecco perché questa è una soluzione "goffa".

Supponendo di avere due nidificati tag "DEF", l'XSL apparirebbe come segue:

<xsl:for-each select="abc"> 
    <xsl:variable name="level1Count" select="position() - 1"/> 
    <xsl:for-each select="def"> 
     <xsl:variable name="level2Count" select="$level1Count * 2 + position()"/> 
     <xsl:value-of select="$level2Count" /> 
    </xsl:for-each> 
</xsl:for-each> 
+0

Grazie mille pythonquick, il tuo codice funziona bene per me! Mi ci è voluto un sacco di tempo. Grazie! – gacon

+0

Si noti che questo funzionerà solo se ogni 'abc' ha lo stesso numero di bambini def. Inoltre, questo funziona solo con un conteggio 'def' hardcoded. – jelovirt

+0

Molto utile! Ho aggiunto una risposta aggiuntiva che funziona per un numero variabile di bambini 'def'. –

5
<xsl:for-each select="abc"> 
    <xsl:variable name="i" select="position()"/> 
    <xsl:for-each select="def"> 
     <xsl:value-of select="$i" /> 
    </xsl:for-each> 
</xsl:for-each> 
+0

questo non produrrà un 1,2,3,4, ... sequenza a meno che non c'è un solo nidificato tag "def" sotto il tag "abc". – pythonquick

+0

Grazie Chris Doggett ma il mio problema è che quando uso position() nel secondo ciclo al suo interno continua da rezo non dall'ultimo indice nel primo ciclo. Quindi non ho potuto usare il tuo suggerimento! Ma il tuo suggerimento potrebbe essere utile per me di recente, grazie ancora Chris! – gacon

6

Basta cambiare il modo di selezionare gli elementi da un ciclo su:

<xsl:for-each select="abc/def"> 
    <xsl:value-of select="position()"/> 
</xsl:for-each> 

si dovrebbe specificamente bisogno di tenere i cicli nidificati, considerare l'aggiunta di un altro ciclo come questo:

<xsl:variable name="items" select="//abc/def"/> 
<xsl:for-each select="abc"> 
    <xsl:for-each select="def"> 
     <xsl:variable name="id" select="generate-id()"/> 
     <xsl:for-each select="$items"> 
      <xsl:if test="generate-id()=$id"> 
       <xsl:value-of select="position()"/> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:for-each> 
</xsl:for-each> 
1

questo è un ext ensione della risposta di pythonquick che gestisce un diverso numero di sotto-elementi:

<xsl:for-each select="abc"> 
    <xsl:variable name="level1Position" select="position()"/> 
    <xsl:variable name="priorCount" select="count(../abc[position() &lt; $level1Position]/def)"/> 
    <xsl:for-each select="def"> 
     <xsl:variable name="level2Count" select="$priorCount + position()"/> 
     <xsl:value-of select="$level2Count" /> 
    </xsl:for-each> 
</xsl:for-each> 

ingresso:

<root> 
    <abc> 
     <def>A</def> 
     <def>B</def> 
     <def>C</def> 
    </abc> 
    <abc> 
     <def>D</def> 
     <def>E</def> 
    </abc> 
    <abc> 
     <def>F</def> 
    </abc> 
    <abc> 
     <def>G</def> 
     <def>H</def> 
     <def>I</def> 
    </abc> 
</root>