Как получить родительский узел с помощью XQuery? - PullRequest
24 голосов
/ 15 сентября 2010

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

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

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

Ответы [ 4 ]

21 голосов
/ 15 сентября 2010

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

..

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

Более длинные и общие ответы :

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

Выбирает любой узел в документе, имеющий дочерний элемент с именем childnode1, имеющий атрибут childid со значением '51'.

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

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

ExpressionSelectingTheChildNode/..
5 голосов
/ 15 сентября 2010

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

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

тогда XQuery

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

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

2 голосов
/ 15 марта 2013

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

В) Найдите все ситуации, когда наиболее популярный язык одной страны является наименее популярным в другой стране, и в обеих странах указано более одного языка. https://prod -c2g.s3.amazonaws.com / дб / Winter2013 / файлы / 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 голосов
/ 25 апреля 2017

Кроме того, вы также можете использовать функцию fn:root() Xquery.

...