2010-04-21 14 views
0

Quelqu'un peut-il aider avec la question XPath suivante? Compte tenu de l'ensemble de nœuds:XPath attribut correspondant et le contenu d'un élément

<table> 
    <rows> 
    <row> 
     <value column="Product">Coal</value> 
     <value column="Quantity">10000</value> 
    </row> 
    <row> 
     <value column="Product">Iron</value> 
     <value column="Quantity">5000</value> 
    </row> 
    <row> 
     <value column="Product">Ore</value> 
     <value column="Quantity">4000</value> 
    </row> 
    </rows> 
</table>

Je souhaite interroger le sous-ensemble de nœuds avec un nom de produit donné. Notez que le nom du produit est fourni par un attribut du nœud actuel en cours de traitement ("@nom"). Ainsi, lorsque l'attribut @name a la valeur de « charbon » Je me attends à ce à retourner:

<row> 
    <value column="Product">Coal</value> 
    <value column="Quantity">10000</value> 
</row>

C'est ce que je suis venu avec; Je sais que c'est faux, parce que je ne reçois rien.

$table/rows/row[value[@column='Product'][text()[email protected]]]

</code >

+0

Vous pouvez publier du code XML réel avec les angles, si vous venez de mettre en surbrillance les lignes de XML, puis appuyez sur le bouton "code" (101 010) dans la barre d'outils de l'éditeur. Pas besoin de remplacer manuellement toutes les équerres avec <et> ..... –

+0

Ohhh, merci pour la pointe. Je savais qu'il aurait dû y avoir un moyen plus facile :-) – gerrod

Répondre

2

Il vous manque évidemment la fonction current()

 
$table/rows/row[value[@column='Product'] = current()/@name] 

Dans un prédicat XPath (par exemple entre crochets) le noeud contextuel est le noeud le prédicat est appliqué à .

Dans votre cas, lorsque vous dites $table/rows/row[[email protected]], alors @name fait référence à l'attribut @name de row. Qui n'a pas d'attribut @name, donc le prédicat évalue toujours à false pour tous les nœuds.

current()current() renvoie le noeud de contexte XSLT en cours pour vous aider dans ce cas précis.

+0

Parfait, merci Tomalak. Je suis venu avec une solution de rechange en copiant d'abord l'attribut @name à une variable, mais la vôtre est beaucoup plus agréable. – gerrod

+0

Je ne pense pas que vous avez besoin de courant(), peut-être que je me trompe, mais n'est pas courant() la même chose que '.'? –

+2

@vtd: Oui, vous avez tort. Si 'current()' était le même que '.', alors' current() 'n'existerait pas. ;) – Tomalak