2010-09-14 5 views
19

Я использую XML и XQuerie. Обычно я использую выражение XPath относительно родительского узла для извлечения его дочернего узла. Но я не уверен, как сделать противоположный смысл, если у меня есть дочерний узел, как я могу получить его родительский узел.Как получить родительский узел с помощью XQuery?

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

Если у меня есть узел <childnode1 childid="51" />, как я могу получить его родитель: <node id="50>

+0

Хороший вопрос (+1). См. Мой ответ для нескольких возможных решений. –

ответ

18

Короткий ответ:

.. 

Выбирает родителя текущего (контекста) узла.

дольше и более общие ответы:

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

Это выбирает любой узел в документе, который имеет дочерний элемент с именем childnode1, который имеет атрибут объявления childid, значение которого «51».

Следует избегать выражения, содержащего аббревиатуру //, поскольку это может быть очень неэффективным. Используйте «//» только в том случае, если структура документа XML неизвестна заранее.

Лучший ответ:

ExpressionSelectingTheChildNode/.. 
3

вы используете .., чтобы получить родитель, как это:

../childnode1 

так что если у вас есть некоторые XML документ такой:

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

then XQuery

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

возвратит c узел с id из 3.

+0

Ваше выражение означает: * от всех родителей узловых узлов (то же, что и все узлы, имеющие дочерний элемент), '' 'd' с атрибутом' id', равным '4' *. Итак, это не то, о чем спрашивает OP ... – 2010-09-14 21:04:02

2

Вот более сложный пример получения родительского узла (..).

Q) Найдите все ситуации, когда самый популярный язык одной страны является наименее популярным, и обе страны перечисляют более одного языка. 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

В качестве альтернативы, вы можете также использовать fn:root() функции XQuery.

Смежные вопросы