Имя итерационной переменной в xsl:for-each на xsl:key в XSLT 1.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: для каждого, как это

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

Мой вопрос: что происходит в??? часть? (То есть как называется переменная итерации итерации?)

2 ответа

Решение

Внутри тега xsl:for-each контекст на каждой итерации является проверяемым узлом. Таким образом ??? в вашем вопросе следует заменить на .

Насколько я понимаю, ключ может хранить более одного значения для определенного элемента

Нет. Ключ может отображать значение с более чем одним узлом.

Так вот:

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

Вы говорите: пусть будет $ врагаСписок всех value атрибуты из attributes дочерние элементы от каждого узла, у которого есть ключ "врага", значение которого равно контексту узла key атрибута, и если длина строки строкового значения из первого узла в наборе узлов $evilList больше 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 атрибут узла контекста... (тот, который сопоставлен с ключом)

Другие вопросы по тегам