21

xsl:for ループをネストしました:

<xsl:for-each select="/Root/A">
    <xsl:for-each select="/Root/B">
        <!-- Code -->
    </xsl:for>
</xsl:for>

内側のループ内から、外側のループの現在のノードの属性にアクセスするにはどうすればよいですか?

私は自分が次のようなコードを書いていることに気づき続けています:

<xsl:for-each select="/Root/A">
    <xsl:variable name="someattribute" select="@SomeAttribute"/>
    <xsl:for-each select="/Root/B">
        <!-- Now can use $someattribute to access data from 'A' -->
    </xsl:for>
</xsl:for>

いくつかの情報にアクセスする必要があり、それぞれの情報に対して 1 つの変数を作成する必要がある場合があるため、これはうまくスケーリングできません。もっと簡単な方法はありますか?

4

3 に答える 3

26

/Root/A 構造全体を変数に格納し、アクセスする必要があるすべての属性とサブ要素に対して新しい変数を作成するのではなく、その変数を参照できます。

<xsl:for-each select="/Root/A/">
    <xsl:variable name="ROOT_A" select="."/>
    <xsl:for-each select="/Root/B/">
         <!-- Variable is accessed like this: $ROOT_A/@someAttribute
              Just like a normal XML node -->
    </xsl:for-each>
</xsl:for-each>
于 2009-01-17T12:44:21.720 に答える
8

Welbogは適切に回答していますが、カルテション (クロス) 結合を行っているように見えることに注意してください。これは意図的なものですか? 通常の結合 (述語などを使用) を行おうとしている場合は、調べたいと思います<xsl:key/>。つまり、キーを宣言します。

<xsl:key name="BIndex" match="/Root/B" use="SomeChildNode"/>

次に、述語で消費します。

<xsl:for-each select="/Root/A/">
    <xsl:variable name="ROOT_A" select="."/>
    <xsl:for-each select="key('BIndex', LocalNode)">
     <!-- -->
    </xsl:for-each>
</xsl:for-each>

これは、次の述語と同等 (ただし、それよりもはるかに高速) である必要があります。

    <xsl:for-each select="/Root/B[SomeChildNode = current()/LocalNode]">

データをグループ化する場合は、 Muenchian グループ化を見てください。

于 2009-01-17T13:00:11.517 に答える