2014-11-22 43 views
0

我不知道如何說出我想要做的事情,但我試圖獲得FID,BID和某些東西的所有信息。考慮下面的XML:如何使用XQuery中的子元素執行「加入」

<FOO> 
    <FID>f1</FID> 
    <NAME>f1</NAME> 
    <BAR> 
     <BID>b1</BID> 
     <SOMETHING>15</SOMETHING> 
    </BAR> 
    <BAR> 
     <BID>b2</BID> 
     <SOMETHING>25</SOMETHING> 
    </BAR> 
</FOO> 
<FOO> 
    <FID>f2</FID> 
    <NAME>f2</NAME> 
    <BAR> 
     <BID>b1</BID> 
     <SOMETHING>35</SOMETHING> 
    </BAR> 
    <BAR> 
     <BID>b3</BID> 
     <SOMETHING>0</SOMETHING> 
    </BAR> 
</FOO> 

我需要的是:

b1 f1 15 
b1 f2 35 
b2 f1 25 
b3 f2 0 

任何人都知道,我會使用的語法? 我想:

for $foo in /root/FOO 
for $bar in /root/FOO/BAR 
let $fid := $foo/FID/text() where $foo/BAR/BID/text()=$bar/BID/text() 
let $bid := $foo/BAR/BID/text() where $foo/BAR/BID/text()=$bar/BID/text() 
let $something := $foo/BAR/SOMETHING/text() where $foo/BAR/BID/text()=$bar/BID/text() 
+0

你試過了什麼?堆棧溢出不是自由職業者自由平臺。另外,您的XML輸入格式不正確。 – 2014-11-22 20:34:46

+0

修正了xml,我嘗試了Foo和Bar的雙重循環,但是產生了重複的結果 – 2014-11-22 21:00:42

+0

現在看起來更好。對於一個很好的問題,還包括實際輸出(以及任何錯誤消息和警告)。查看[問]和[如何創建SSCCE](http://www.sscce.org)瞭解更多詳情。 – 2014-11-22 21:18:40

回答

0

如果你想通過<FID/>元素先訂購,這將會是那麼容易,因爲循環在<FOO/> S,爲他們每個人在其<BAR/> S和傾倒每一個串時間:

for $foo in /root/FOO 
for $bar in /BAR 
return string-join(($foo/FID, $bar/BID, $bar/SOMETHING), ' ') 

對於由<BID/>小號分組,你必須遍歷這些第一和相對收集的其他信息:

for $bar in //BAR 
order by $bar/BID 
return string-join(($bar/BID, $bar/../FID, $bar/SOMETHING), ' ') 

一個小的評論(因爲我沒有進行大規模清理就無法運行你的代碼):$foo$FOO不一樣,XQuery區分大小寫。此外,您錯過了return條款。