Как получить родительский 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>
Ответы
Ответ 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.