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!

Foi útil?

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() &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>

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top