2010-09-14 110 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函數的。