web-dev-qa-db-ja.com

ループXSLのインデックス

このようにXSLに2つのネストされたループがあります。現時点では、position()を使用していますが、それは私が必要とするものではありません。

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

このスタブのアイデアを教えてください。どうもありがとうございました!

15
gacon

XSLでは、問題は変数を変更できないことです(設定している定数のようなものです)。そのため、カウンタ変数のインクリメントは機能しません。

連続カウント(1,2,3,4、...)を取得するための不器用な回避策は、position()を呼び出して「abc」タグの反復を取得し、position()を呼び出してネストされた「def」を取得することです。 "タグの反復。次に、「abc」イテレーションに含まれる「def」タグの数を乗算する必要があります。これが「不格好な」回避策である理由です。

2つのネストされた「def」タグがあるとすると、XSLは次のようになります。

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

ループするアイテムを選択する方法を変更するだけです。

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

ネストされたループを保持する必要がある場合は、次のような別のループを追加することを検討してください。

<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>
6
mousio
<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>
5
Chris Doggett

これは、さまざまな数のサブ要素を処理するpythonquickの回答の拡張です。

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

入力:

<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>
1
Nate Cook