2010-09-14 20 views
19

Ich verwende XML und XQuerie. Normalerweise verwende ich einen XPath-Ausdruck relativ zu einem Elternknoten, um seinen Kindknoten abzurufen. Aber ich bin mir nicht sicher, wie ich die gegenteilige Bedeutung tun soll, wenn ich einen Kindknoten habe, wie ich seinen Elternknoten abrufen kann.Wie Elternknoten mit XQuery abrufen?

<node id="50> 
    <childnode1 childid="51" /> 
    <childnode2 childid="52" /> 
</node> 

Wenn ich den Knoten <childnode1 childid="51" /> haben, wie rufe ich seine Eltern: <node id="50>

+0

Gute Frage (+1). Siehe meine Antwort für einige mögliche Lösungen. –

Antwort

18

Kurze Antwort:

.. 

Dies das Elternteil der aktuellen (Kontext) Knoten auswählt.

Längere und allgemeine Antworten:

//node()[childnode1/@childid="51"] 

Dies wählt einen beliebigen Knoten in dem Dokument, das ein Kind-Element hat childnode1 genannt, die einen attibute hat childid, dessen Wert '51'.

Man sollte versuchen, einen Ausdruck zu vermeiden, der die Abkürzung // enthält, weil dies sehr ineffizient sein kann. Verwenden Sie '//' nur, wenn die Struktur des XML-Dokuments nicht im Voraus bekannt ist.

Beste Antwort:

ExpressionSelectingTheChildNode/.. 
3

Sie .. verwenden, um die Eltern zu bekommen, wie folgt aus:

../childnode1 

so, wenn Sie einige XML haben Dokument wie folgt:

<a id="1"> 
    <b id="2"> 
    <c id="3"> 
     <d id="4"/> 
    </c> 
    <c id="5"/> 
    <c id="6"> 
     <d id="7"/> 
    </c> 
    </b> 
</a> 

dann die XQuery

//../d[@id = "4"] 

zurückkehren würde den Knoten mit cid von 3.

+0

Ihr Ausdruck bedeutet: * Von allen Eltern von Nachkommenknoten (das gleiche wie alle Knoten, die ein Kind haben) ein 'd' Kind mit 'ID'-Attribut gleich' 4 '*. Es ist also nicht das, was das OP verlangt ... –

2

Hier ist ein komplexeres Beispiel für den übergeordneten Knoten bekommen (..).

Q) Finden Sie alle Situationen, in denen die beliebteste Sprache eines Landes am wenigsten beliebt ist und beide Länder mehr als eine Sprache enthalten. https://prod-c2g.s3.amazonaws.com/db/Winter2013/files/countries.xml

A)

for $b in doc("countries.xml")/countries/country/language 
for $c in doc("countries.xml")/countries/country/language 
where $b/../@name != $c/../@name 
and data($b) = data($c) 
and count($b/../language) > 1 
and count($c/../language) > 1 
and $b/@percentage = max($b/../language/@percentage) 
and $c/@percentage = min($c/../language/@percentage) 
return 
    <LangPair language="{data($b)}"> 
    <MostPopular>{data($b/../@name)}</MostPopular> 
    <LeastPopular>{data($c/../@name)}</LeastPopular> 
    </LangPair> 
0

Alternativ können Sie auch die Verwendung von fn:root() XQuery-Funktion machen.

Verwandte Themen