2010-09-14 95 views
19

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

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

如果我有节点<childnode1 childid="51" />,我该如何找回它的父:<node id="50>

+0

好问题(+1)。查看我的答案以获得一些可能的解决方案 – 2010-09-14 21:37:35

回答

18

短的答案

.. 

这将选择的电流(上下文)节点的父节点。

更长和更一般的答案

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

此选择具有名为childnode1的子元素,其具有attibute childid,其值为“51”的文档中的任何节点。

一个应该尽量避免包含//缩写的表达式,因为这可能是非常低效的。仅当XML文档的结构未知时才使用“//”。

最佳答案

ExpressionSelectingTheChildNode/.. 
3

您使用..获取父,是这样的:

../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"] 

将与3id返回c节点。

+0

你的表达意思是:*来自所有的死亡节点的父母(与所有有孩子的节点相同)'id'属性等于'4'的'd'孩子*。所以,这不是OP要求的... – 2010-09-14 21:04:02

2

下面是获取父节点(..)的一个更复杂的例子。 Q)找到一个国家最受欢迎的语言是另一个国家最不受欢迎的语言,并且两个国家都列出了多种语言。 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> 
0

另外,您还可以使用fn:root() XQuery函数的。