2009-05-30 11 views
14

Tengo dos bucles anidados en XSL como este, en este momento uso la posición() pero no es lo que necesito.índice en el bucle 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> 

¿Puede darme una idea para este trozo. ¡Muchas gracias!

Respuesta

18

Con XSL, el problema es que no se puede cambiar una variable (que es más como una constante que se está configurando). Entonces, incrementar una variable contraria no funciona.

Una solución torpe para obtener un recuento secuencial (1,2,3,4, ...) sería llamar a position() para obtener la iteración de etiqueta "abc", y otra llamada a position() para obtener la iteración de etiqueta "def" anidada. Entonces necesitarás multiplicar la iteración "abc" por el número de etiquetas "def" que contiene. Es por eso que esta es una solución "torpe".

Asumiendo que tiene dos etiquetas anidadas "def", el XSL se vería de la siguiente manera:

<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

Muchas gracias pythonquick, ¡el código funciona bien para mí! Me llevó mucho tiempo perderlo. ¡Gracias! – gacon

+0

Tenga en cuenta que esto funcionará solo si cada 'abc' tiene la misma cantidad de def children. Además, esto solo funciona con un conteo de 'def' duro. – jelovirt

+0

¡Muy útil! He agregado una respuesta adicional que funciona para una cantidad variable de hijos '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

esto no va a producir un 1,2,3,4, ... secuencia a menos que haya un solo anidada etiqueta "def" debajo de la etiqueta "abc". – pythonquick

+0

Gracias, Chris Doggett, pero mi problema es que cuando uso position() en el segundo ciclo dentro, continúa desde rezo, no desde el último índice en el primer ciclo. ¡Así que no podría usar tu sugerencia! Pero su sugerencia puede ser útil para mí recientemente, ¡gracias de nuevo Chris! – gacon

6

Sólo cambia la forma de seleccionar los artículos a un bucle sobre: ​​

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

en caso de que específicamente necesita mantener los bucles anidados, considere agregar otro bucle como este:

<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

This is an ext ensión de la respuesta de pythonquick que maneja diferentes números de sub-elementos:

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

de entrada:

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