Frage

Ich habe zwei verschachtelte Schleifen in XSL wie diese, in diesem Moment ich Position (), aber es ist nicht das, was ich brauche.

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

Können Sie mir eine Idee für diesen Stummel. Vielen Dank!

War es hilfreich?

Lösung

Mit XSL ist das Problem, das Sie eine Variable nicht ändern können (es ist mehr wie eine Konstante, dass Sie setzen). So erhöht wird eine Zählervariable funktioniert nicht.

Eine ungeschickte Abhilfe eine sequentielle Zählung zu erhalten (1,2,3,4, ...) wäre Position () aufzurufen, die „abc“ Tag-Iteration, und einen weiteren Anruf Position zu bekommen () erhalten die verschachtelte "def" Tag-Iteration. Sie würden dann müssen die „abc“ Iteration mit der Anzahl der „def“ Tags multiplizieren, die es enthält. Deshalb ist dieses eine „ungeschickte“ Abhilfe ist.

Angenommen, Sie zwei verschachtelte "def" Tags haben, sieht das XSL wie folgt:

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

Andere Tipps

Sie einfach die Art und Weise ändern, die Elemente in der Schleife über wählen:

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

Wenn Sie speziell auf die verschachtelten Schleifen zu halten brauchen, sollten Sie erwägen, noch eine weitere Schleife wie folgt:

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

Dies ist eine Erweiterung von pythonquick Antwort, die eine unterschiedliche Anzahl von Unterelementen behandelt:

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top