2010-01-29 7 views
19

Compte tenu de ce document xml:En utilisant XQuery/XPath pour obtenir la valeur d'attribut du nœud parent d'un élément

<?xml version="1.0" encoding="UTF-8"?> 
    <mydoc> 
     <foo f="fooattr"> 
      <bar r="barattr1"> 
       <baz z="bazattr1">this is the first baz</baz> 
      </bar> 
      <bar r="barattr2"> 
       <baz z="bazattr2">this is the second baz</baz> 
      </bar> 
     </foo> 
    </mydoc> 

qui est en cours de traitement par ce XQuery:

let $d := doc('file:///Users/mark/foo.xml') 
let $barnode := $d/mydoc/foo/bar/baz[contains(@z, '2')] 
let $foonode := $barnode/../../@f 
return $foonode 

Je reçois l'erreur suivante: Il semble que l'opération ../ consiste en quelque sorte à supprimer les nœuds correspondants du reste du document, de telle sorte que l'opération ../ pense que c'est le noeud de document.

Je suis ouvert à d'autres approches, mais la sélection du parent dépend de l'attribut enfant contenant une certaine sous-chaîne.

À la votre!

Répondre

30

La requête que vous avez écrite sélectionne l'attribut f. Toutefois, il n'est pas légal de renvoyer un noeud d'attribut à partir d'un XQuery. L'erreur fait référence au document de sortie qui contient juste un attribut (bien que ce message d'erreur soit trompeur, car techniquement, il n'y a pas de document de sortie ici, il y a juste un nœud d'attribut qui est retourné).

Vous vouliez probablement retourner la valeur de l'attribut plutôt que l'attribut lui-même

return data($foonode) 
+0

En effet, je fait! Merci beaucoup. –

Questions connexes