Имя итерационной переменной в xsl: for-each на xsl: key в XSLT 1.0 - PullRequest
0 голосов
/ 29 июля 2010

У меня есть код 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>

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

Ответы [ 2 ]

1 голос
/ 30 июля 2010

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

0 голосов
/ 29 июля 2010

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

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

Итак, вот:

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

Вы говорите: позвольте быть $ templeList всех атрибутов value из attributes дочерних элементов каждого узла, у которого есть ключ 'врага-элемента' со значением, равным атрибуту key контекста узла, и если длина строки строкового значения из первого узла в наборе узлов $ templeList больше 0, затем выведите значение атрибута name контекстного узла.

EDIT : во втором фрагменте 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"/> 

Это атрибут de name узла контекста ... (тот, который сопоставлен с ключом)

...