我正在使用XML和XQuerie。我通常使用相对于父节点的XPath表达式来检索其子节点。但是,如果我有一个子节点,我不知道如何做相反的意思,我该如何检索它的父节点。
<node id="50>
<childnode1 childid="51" />
<childnode2 childid="52" />
</node>
如果我有节点<childnode1 childid="51" />
,我该如何检索其父节点:<node id="50>
答案 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
id
个3
节点。
答案 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函数。