Domanda

Ho due ciclo nidificato in XSL come questo, in questo momento io uso posizione () ma non è quello che mi serve.

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

Mi può dare qualche idea per questo stub. Grazie mille!

È stato utile?

Soluzione

Con XSL, il problema è che non puoi cambiare una variabile (è più come una costante che si sta impostando). Quindi incrementare una variabile contatore non funziona.

Una soluzione goffa per ottenere un conteggio sequenziale (1,2,3,4, ...) sarebbe quello di chiamare posizione () per ottenere il "abc" tag iterazione, e un'altra chiamata nella posizione () per ottenere la nidificato "def" iterazione tag. Si sarebbe quindi necessario moltiplicare l'iterazione "abc" con il numero di "DEF" tag in esso contenuti. Ecco perché questa è una soluzione "maldestra".

Supponendo di avere due nidificati tag "DEF", l'XSL apparirebbe come segue:

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

Altri suggerimenti

Basta cambiare il modo di selezionare gli elementi da un ciclo su:

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

Se avete specificamente necessario per mantenere i cicli nidificati, considerare l'aggiunta di un altro ciclo come questo:

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

Si tratta di un'estensione della risposta di pythonquick che gestisce un diverso numero di sotto-elementi:

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top