【问题标题】:Name of iteration variable in xsl:for-each on xsl:key in XSLT 1.0xsl:for-each 中的迭代变量名称 xsl:key 在 XSLT 1.0
【发布时间】:2010-07-29 16:07:45
【问题描述】:

我有这样的 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>

我的问题是: ???部分? (即迭代变量或事物的名称是什么?)

【问题讨论】:

    标签: xslt xslkey


    【解决方案1】:

    在 xsl:for-each 标记内,每次迭代的上下文是被检查的节点。因此,您问题中的 ??? 应替换为 .

    【讨论】:

    • 或者什么都没有,作为我的回答。这解释了为什么现在@name(for-each 内部)与以前(for-each 外部)的含义不同
    【解决方案2】:

    据我了解,密钥可以存储 一个特定的多个值 元素

    没有。一个键可以将一个值映射到多个节点。

    所以,这里:

    <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 来自每个节点的 attributes 子元素中的所有 value 属性,其值等于上下文节点的 key 属性的 'enemyItems' 键,如果$enemyList节点集中first节点的字符串值的字符串长度大于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"/> 
    

    如果有多个具有value 属性的attributes 子节点,这也可能返回多个节点。但是现在,这个:

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

    这是上下文节点的name 属性...(带有键的唯一映射)

    【讨论】:

    • 是的,但是如何获取 $enemyList 节点集中的其他节点(第一个节点除外)?这就是我要问的。
    • @Paul Rainers:你想用它们做什么?从你的问题中不清楚。是否要测试每个节点的string-value的string-length都大于cero,然后输出context节点的name属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2019-03-27
    相关资源
    最近更新 更多