Подтвердить что ты не робот

Как получить родительский node с помощью XQuery?

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

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

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

4b9b3361

Ответ 1

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

..

Это выбирает родительский элемент текущего (контекста) node.

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

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

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

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

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

ExpressionSelectingTheChildNode/..

Ответ 2

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

../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 node с помощью id 3.

Ответ 3

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

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>

Ответ 4

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