2010-07-02 4 views
0

je XML comme ceci:nœuds de comptage dans XSLT dont les nœuds parents ont certains attributs

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

Je veux compter le nombre d'éléments qui se trouvent dans une section qui a une variable_name de « POINTAGE ».

Je pensais que ce serait faire le travail:

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

Cependant, cette sortie:

1 
0 

pas

3 
0 

qui est ce que j'attendais (et que vous voulez) .

Qu'est-ce que je fais mal ici?

Répondre

2
<xsl:variable name="scoredItems" 
       select="./item/../attributes/variable_name[@value='SCORE']"/> 

Ce sélectionne tous les éléments variable-name tels que leur attribut value a une valeur de 'SCORE'. Et ce est juste un noeud.

Vous voulez:

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

Ce sélectionne tous les éléments de l'élément dans le cas où le nœud de contexte (section) comporte un élément attributes qui a un élément variable_name dont value attribut est ` 'POINTAGE'.

Si le nœud de contexte n'a pas cette propriété, l'expression XPath ci-dessus ne sélectionne rien.

Maintenant, la transformation corrigée:

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

produit le résultat recherché:

3 
0 
Questions connexes