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属性,attributes它有一个 'enemyItems' 键,其值等于上下文节点的key属性,如果$enemyList 节点中第一个节点的字符串值的字符串长度set 大于 0,则输出上下文节点的name属性值。

编辑:在您的第二个 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 回答