如何使用 XQuery 检索父节点?

Posted

技术标签:

【中文标题】如何使用 XQuery 检索父节点?【英文标题】:How to retrieve parent node using XQuery? 【发布时间】:2011-04-12 08:45:13 【问题描述】:

我正在使用 XML 和 XQuery。我通常使用相对于父节点的 XPath 表达式来检索其子节点。但是,如果我有一个子节点,我不确定如何做相反的意思,我如何检索它的父节点。

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

如果我有节点&lt;childnode1 childid="51" /&gt;,我如何检索它的父节点:&lt;node id="50&gt;

【问题讨论】:

好问题 (+1)。请参阅我的答案以了解一些可能的解决方案。 【参考方案1】:

简答

..

这会选择当前(上下文)节点的父节点。

更长更一般的答案

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

这将选择文档中具有名为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"]

将返回带有idc 节点3

【讨论】:

您的表达意思是:来自后代节点的所有父节点(与所有具有子节点的节点相同)d 子节点的id 属性等于'4' .所以,这不是 OP 所要求的......【参考方案3】:

这里有一个更复杂的获取父节点(..)的例子。

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 函数。

【讨论】:

以上是关于如何使用 XQuery 检索父节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MS SQL 2005 中使用 SQL XQuery 修改多个节点

如何删除 XQuery 中的重复节点?

xQuery,如何从带有孩子的节点获取文本?

如何在 XQuery 中选择节点的属性值?

XQUERY SQL - 如何将单个节点元素作为变量传递?

如何编写可以测试正在使用的 XQuery 版本的 XQuery?