Question

J'ai deux boucles imbriquées dans ce XSL comme, en ce moment j'utilise la position (), mais ce n'est pas ce que je dois.

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

Pouvez-vous me donner une idée de ce talon. Merci beaucoup!

Était-ce utile?

La solution

Avec XSL, le problème est que vous ne pouvez pas changer une variable (il est plus comme une constante qui vous configurez). Donc incrémenter une variable compteur ne fonctionne pas.

Une solution maladroite pour obtenir un nombre séquentiel (1,2,3,4, ...) serait en position appeler () pour obtenir l'itération tag « abc », et un autre appel à la position () pour obtenir la imbriquée itération tag "def". Vous devrez alors multiplier l'itération « abc » avec le nombre de balises « DEF » qu'il contient. Voilà pourquoi cela est une solution de contournement « maladroite ».

En supposant que vous avez deux balises « DEF » imbriqués, le XSL regarderait comme suit:

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

Autres conseils

Il suffit de changer la façon de sélectionner les éléments à boucle sur:

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

Si vous avez besoin spécifiquement pour garder les boucles imbriquées, envisager d'ajouter une autre boucle comme ceci:

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

Ceci est une extension de la réponse de pythonquick qui gère différents nombres de sous-éléments:

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

Entrée:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top