如何使用XQuery检索父节点?

时间:2010-09-14 20:05:46

标签: xml xpath parent-child xquery

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

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

如果我有节点<childnode1 childid="51" />,我该如何检索其父节点:<node id="50>

4 个答案:

答案 0 :(得分:19)

简短回答

..

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

更长,更一般的答案

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

这将选择文档中具有名为childnode1的子元素的任何节点,该元素具有属性childid,其值为“51”。

应该尽量避免使用包含//缩写的表达式,因为这可能效率很低。仅在事先不知道XML文档的结构时才使用'//'。

最佳答案

ExpressionSelectingTheChildNode/..

答案 1 :(得分:4)

您使用..获取父级,如下所示:

../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 id3节点。

答案 2 :(得分:2)

以下是获取父节点(..)的更复杂示例。

问)找出一个国家最受欢迎的语言是另一个国家最不受欢迎的语言,并且这两个国家都列出了多种语言。 https://prod-c2g.s3.amazonaws.com/db/Winter2013/files/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>

答案 3 :(得分:0)

或者,您也可以使用fn:root() Xquery函数。