Подсчет узлов в XSLT, родительские узлы которых имеют определенные атрибуты - PullRequest
0 голосов
/ 02 июля 2010

У меня есть XML как это:

<exam>
    <section name="SampleSection1">
        <attributes>
            <variable_name data_type="String" value="SCORE"/>
        </attributes>
        <item name="SampleItem1-1"/>
        <item name="SampleItem1-2"/>
        <item name="SampleItem1-3"/>
    </section>
    <section name="SampleSection2">
        <attributes>
            <variable_name data_type="String" value="NO-SCORE"/>
        </attributes>
        <item name="SampleItem2-1"/>
        <item name="SampleItem2-2"/>
    </section>
</exam>

Я хочу посчитать количество элементов в разделе с именем переменной SCORE.

Я думал, что это сделает работу:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

    <xsl:template match="section">
        <xsl:variable name="scoredItems"
                  select="./item/../attributes/variable_name[@value='SCORE']"/>
        <xsl:variable name="scoredItemsCount" select="count($scoredItems)"/>
        <xsl:value-of select="$scoredItemsCount"/>
    </xsl:template>
</xsl:stylesheet>

Однако, это выводит:

1
0

не

3
0

что я и ожидал (и хотел).

Что я здесь не так делаю?

1 Ответ

2 голосов
/ 02 июля 2010
    <xsl:variable name="scoredItems" 
              select="./item/../attributes/variable_name[@value='SCORE']"/>

Выбирает все элементы variable-name, так что их атрибут value имеет значение 'SCORE'.И это это только один узел.

Вы хотите:

self::section[attributes/variable_name/@value='SCORE']/item

Это выбирает все элементы элемента в случаеузел контекста (section) имеет элемент attributes, который имеет элемент variable_name, чей атрибут value равен «SCORE».

В случае, если узел контекста не имеет этого свойства,тогда приведенное выше выражение XPath ничего не выбирает.

Теперь исправленное преобразование :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

    <xsl:template match="section">
        <xsl:variable name="scoredItems"
                  select="self::section[attributes/variable_name/@value='SCORE']/item"/>
        <xsl:variable name="scoredItemsCount" select="count($scoredItems)"/>
        <xsl:value-of select="$scoredItemsCount"/>
    </xsl:template>
</xsl:stylesheet>

дает желаемый результат :

3
0
...