Pergunta
Eu tenho dois loop aninhado em XSL como esta, neste momento posição de uso I (), mas não é o que eu preciso.
<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>
Você pode me dar alguma ideia para este esboço. Muito obrigado!
Solução
Com XSL, o problema é que você não pode mudar uma variável (é mais como uma constante que você está definindo). Então incrementar uma variável de contador não funciona.
A desajeitada solução para obter uma contagem seqüencial (1,2,3,4, ...) seria chamar posição () para obter o "abc" tag iteração, e outra chamada para a posição () para obter o nested "def" tag iteração. Você, então, precisa multiplicar a iteração "abc" com o número de "def" tags que ele contém. É por isso que este é um "desajeitado" solução alternativa.
Assumindo que você tem dois "def" tags aninhadas, o XSL ficaria da seguinte forma:
<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>
Outras dicas
Apenas mudar a maneira de selecionar os itens de varrer:
<xsl:for-each select="abc/def">
<xsl:value-of select="position()"/>
</xsl:for-each>
Se você precisar especificamente para manter os laços aninhados, considere a adição de mais um loop 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 é uma extensão da resposta de pythonquick que lida com 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() < $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>
Input:
<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>