Имя итерационной переменной в 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
атрибут узла контекста... (тот, который сопоставлен с ключом)