2010-09-14 16 views
19

Używam XML i XQuerie. Zwykle używam wyrażenia XPath względem węzła nadrzędnego, aby pobrać jego węzeł potomny. Ale nie jestem pewien, jak zrobić przeciwne znaczenie, jeśli mam węzeł podrzędny, w jaki sposób pobrać jego węzeł nadrzędny.Jak odzyskać węzeł nadrzędny za pomocą XQuery?

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

Jeśli mam węzeł <childnode1 childid="51" />, jak mogę odzyskać swój nadrzędny: <node id="50>

+0

Dobre pytanie (+1). Zobacz moją odpowiedź na kilka możliwych rozwiązań. –

Odpowiedz

18

Krótka odpowiedź:

.. 

to wybranie rodzica bieżącego węzła (kontekst).

Dłuższe i bardziej ogólnych odpowiedzi:

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

to wybranie dowolnego węzła w dokumencie, który ma element podrzędny o nazwie childnode1, który ma attibute childid, którego wartość wynosi „51”.

Należy unikać wyrażenia zawierającego skrót //, ponieważ może to być bardzo nieefektywne. Użyj "//" tylko wtedy, gdy struktura dokumentu XML nie jest znana z góry.

Najlepsza odpowiedź:

ExpressionSelectingTheChildNode/.. 
3

użyć .. uzyskać rodzica, tak:

../childnode1 

więc jeśli masz jakieś XML dokument taki jak ten:

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

następnie XQuery

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

powróci do węzła c z id z 3.

+0

Twoje wyrażenie oznacza: * od wszystkich rodziców węzłów podrzędnych (tak samo jak wszystkie węzły posiadające dziecko) 'd' dziecko z atrybutem 'id' równym' 4 '*. A zatem to nie jest to, o co prosi OP ... –

2

Tutaj jest bardziej złożony przykład coraz węzeł nadrzędny (..).

Q) Znajdź wszystkie sytuacje, w których jeden z najpopularniejszych języków w kraju jest najmniej popularny w innym kraju, a oba kraje wymieniają więcej niż jeden język. https://prod-c2g.s3.amazonaws.com/db/Winter2013/files/countries.xml

)

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

Alternatywnie, można również skorzystać z funkcji fn:root() XQuery.

Powiązane problemy