0

次のような XSLT 1.0 コードがあります。

<xsl:key name="enemyItems"
         match="metadata[attributes/metadata_key/@value = 'enemylist']"
         use="attributes/metadata_refkey/@value"/>

<xsl:template match="item">
    <xsl:variable name="enemyList"
                  select="key('enemyItems', @key)/attributes/@value"/>
    <xsl:if test="string-length($enemyList) > 0">
        <xsl:value-of select="@name"/>
    </xsl:if>
</xsl:template>

私が理解しているように、キーは特定の要素に対して複数の値を格納できます。上記のコードは、 を参照するときに最初の値しか取得していないと思いますkey('enemyItems', @key)

だから、私はこのように、xsl:for-each でそのコードをラップしたい

    <xsl:template match="item">
        <xsl:for-each select="key('enemyItems', @key)">
            <xsl:variable name="enemyList"
                      select="???/attributes/@value"/>
            <xsl:if test="string-length($enemyList) > 0">
                <xsl:value-of select="@name"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

私の質問は: ??? には何が入りますか? 部?(つまり、反復変数またはものの名前は何ですか?)

4

2 に答える 2

1

xsl:for-each タグ内では、各反復のコンテキストは検査対象のノードです。したがって、???質問の はに置き換える必要があります.

于 2010-07-29T20:31:06.440 に答える
0

私が理解しているように、キーは特定の要素に対して複数の値を格納できます

いいえ。キーは値を複数のノードにマップできます。

だから、ここに:

<xsl:variable name="enemyList"  
              select="key('enemyItems', @key)/attributes/@value"/>  
<xsl:if test="string-length($enemyList) > 0">  
    <xsl:value-of select="@name"/>  
</xsl:if>

あなたが言っている: $enemyListノードの最初のノードvalueからの文字列値の文字列の長さが $enemyList ノードの最初のノードからの文字列値の文字列の長さset が 0 より大きい場合、コンテキスト ノードの属性の値を出力します。attributeskeyname

編集: 2 番目の XSLT フラグメントで:

<xsl:template match="item"> 
    <xsl:for-each select="key('enemyItems', @key)"> 
        <xsl:variable name="enemyList" 
                  select="???/attributes/@value"/> 
        <xsl:if test="string-length($enemyList) > 0"> 
            <xsl:value-of select="@name"/> 
        </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

ここで、 内for-eachで、コンテキスト ノードは、キーでマップされるすべてのノードです。したがって、次のように定義できます$enemyList

<xsl:variable name="enemyList" select="attributes/@value"/> 

attributes属性を持つ子が複数ある場合、これは複数のノードを返すこともありvalueます。しかし今、これ:

<xsl:value-of select="@name"/> 

これnameはコンテキストノードの属性です...(キーでマップされるもの)

于 2010-07-29T17:21:23.920 に答える