Pregunta

Tengo dos bucles anidados en XSL como este, en este momento uso position() pero no es lo que necesito.

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

¿Puedes darme alguna idea para este trozo?¡Muchas gracias!

¿Fue útil?

Solución

Con XSL, el problema es que no se puede cambiar una variable (que es más como una constante que se está configurando). Por lo tanto incrementando una variable de contador no funciona.

Una solución torpe para obtener un conteo secuencial (1,2,3,4, ...) sería llamar la posición () para obtener el "abc" iteración etiqueta, y otra llamada a la posición () para obtener el anidada "def" iteración etiqueta. A continuación, tendría que multiplicar la iteración "abc" con el número de etiquetas "def" que contiene. Es por eso que esto 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>

Otros consejos

Simplemente cambie la forma de seleccionar los elementos para recorrer:

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

Si necesita específicamente 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>
<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>

Esta es una extensió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>

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top