2010-01-29 10 views
19

Vor diesem XML-Dokument zu erhalten:XQuery/XPath Mit dem Attributwert eines Elements übergeordneten Knoten

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

, die von diesem xquery verarbeitet wird:

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

ich die folgende Fehlermeldung erhalten:

"Cannot create an attribute node (f) whose parent is a document node". 

es scheint, dass der ../ Betrieb Art ist vom Rest des Dokuments mit dem passenden Knoten zu entfernen, so dass es denkt, es ist der Dokumentknoten.

Ich bin offen für andere Ansätze, aber die Auswahl der Eltern hängt von dem Kind-Attribut, das eine bestimmte Unterzeichenfolge enthält.

Prost!

Antwort

30

Die von Ihnen geschriebene Abfrage wählt das Attribut f aus. Es ist jedoch nicht zulässig, einen Attributknoten von einer XQuery zurückzugeben. Der Fehler bezieht sich auf das Ausgabedokument, das hier nur ein Attribut enthält (obwohl diese Fehlermeldung irreführend ist, da es technisch gesehen kein Ausgabedokument gibt, gibt es nur einen Attributknoten, der zurückgegeben wird).

Sie wollten wahrscheinlich den Wert des Attributs nicht das Attribut zurückzukehren selbst

return data($foonode) 
+0

der Tat habe ich! Vielen Dank. –

Verwandte Themen