2010-07-02 2 views
0

У меня есть XML, как это:счетных узлов в XSLT, чьи родительские узлы имеют определенные атрибуты

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

Я хочу, чтобы подсчитать количество элементов, которые находятся в разделе, который имеет variable_name из «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 

который я бы ожидать (и хотят) ,

Что я здесь делаю неправильно?

ответ

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