2013-11-28 69 views
0

我有這個文件的XML:的XQuery - 查詢恢復父母節點

<EV id="000" age="10"> 
    <specie cod="e00"/> 
    <acc child="002"/> 
</EV> 
<EV id="001" age="12"> 
    <specie cod="e01"/> 
    <acc child="002"/> 
</EV> 
<EV id="002" age="2"> 
    <specie cod="e00"/> 
    <acc/> 
</EV> 
<EV id="003" age="30"> 
    <specie cod="e00"/> 
    <acc child="005"/> 
</EV> 
<EV id="004" age="20"> 
    <specie cod="e00"/> 
    <acc child="005"/> 
</EV> 
<EV id="005" age="5"> 
    <specie cod="e00"/> 
    <acc/> 
</EV> 

現在我必須打印結果如何@id的標籤(我的項目的子女)的屬性出現在其他兩個標籤(該父母)在標籤中,但是兩個標籤(父母)必須具有不同的標籤@cod。另一個矛盾是,與兩個父母不同的年齡是5年的微小<(10歲和12歲是好的,20歲和30歲)。

上述xml的示例:xquery必須只打印id =「002」。

感謝您的幫助。

回答

2

這是使用謂詞很多版本:

for $e in /EV 
return $e[count(distinct-values(../EV[acc/@child = $e/@id]/specie/@cod)) = 2][abs(../EV[acc/@child = $e/@id][1]/@age - ../EV[acc/@child = $e/@id][2]/@age) < 5] 

不過,我可能會更喜歡一個更可讀的版本:

for $parent in /EV 
let $childs := $parent/../EV[acc/@child = $parent/@id] 
where 
    count(distinct-values($childs/specie/@cod)) = 2 
    and 
    abs($childs[1]/@age - $childs[2]/@age) < 5 
return $parent 
+0

是,標籤「孩子」總是有兩名家長。/@ id/data(?)謝謝你的回答,明天我試試。 –

+0

@LocalHero對不起,我沒有複製封閉的條款。 – dirkk

+0

你的解決方案很好@dirkk,謝謝:)是否有可能添加這個終極版condiction? 「另一個矛盾是,與父母的不同年齡不到5歲(10歲和12歲是好的,20歲和30歲)」。我編輯了具有屬性age的原始消息和xml文件。感謝您的幫助。 –