2009-05-30 4 views
14

私はこのようにXSLで2つのネストされたループを持っていますが、この時点で私はposition()を使用していますが、必要なものではありません。ループ内のインデックスXSL

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

このスタブについて考えてもらえますか?どうもありがとうございました!

答えて

18

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

逐次カウント(1,2,3,4、...)を取得するには、position()を呼び出して「abc」タグの繰り返しを取得し、positionネストされた "def"タグ反復次に、 "abc"反復にそれに含まれる "def"タグの数を掛ける必要があります。だから、これは "不器用な"回避策です。

あなたがネストされた2つの「DEF」のタグを持っていると仮定すると、のようになりXSLは次のとおりです。特にあなたを

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

必要があります。

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

非常にpythonquickありがとう、あなたは私のためにうまくコード作業!私は多くの時間を無駄にしていました。ありがとうございました! – gacon

+0

これは、すべての 'abc'に等しい数のdef子がある場合にのみ機能することに注意してください。また、これはハードコーディングされた 'def'カウントでのみ機能します。 – jelovirt

+0

非常に役に立ちました!私は可変数の 'def'子供のために働く追加の答えを加えました。 –

5
<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> 
+0

これは、1,2,3,4を生成しません...シーケンスを一つだけ、入れ子がありますしない限り、 "abc"タグの下の "def"タグ。 – pythonquick

+0

Chris Doggettありがとうございますが、私の問題は、内部の2番目のループでposition()を使うと、最初のループの最後のインデックスではなく、rezoから続きます。だから私はあなたの提案を使用することができませんでした!しかし、あなたの提案は私のために最近役に立つかもしれません、再びクリスに感謝します! – gacon

6

ちょうど上のループに項目を選択する方法を変更しますネストされたループを維持する必要がある場合は、次のようなループを追加することを検討してください。

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

これはextサブ要素の異なる数を扱うpythonquickの答えのension:

<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> 
関連する問題