2009-11-16 118 views
7

所以我有這樣的XML數據:的XQuery:如何正確添加,在for循環

<PhoneNumber>213-512-7457</PhoneNumber> 
    <PhoneNumber>213-512-7465</PhoneNumber> 

以及與此的XQuery:

<PhoneNumberList> 
{ 
    for $phone in $c//PhoneNumber 
    let $phoneStr := "" 
    return concat($phoneStr, $phone) 
} 
</PhoneNumberList> 

我得到:

<PhoneNumberList>213-512-7457213-512-7465</PhoneNumberList> 

但我其實想要:

<PhoneNumberList>213-512-7457, 213-512-7465</PhoneNumberList> 

有人可以告訴我如何做到這一點?

回答

12
<PhoneNumberList> 
{ 
    string-join($c//PhoneNumber, ", ") 
} 
</PhoneNumberList> 
+0

噢,我的上帝......像魔術般的工作。謝謝! – sivabudh 2009-11-17 05:20:26

-1

這個怎麼樣?

let $phoneStr := "" 
<PhoneNumberList> 
{ 
    for $phone in $c//PhoneNumber 
    let $result = concat($phoneStr, $phone) 
    let $phoneStr = ", " 
    return $result 
} 
</PhoneNumberList> 
+0

我嘗試運行,但它仍然不添加該......多奇怪。 – sivabudh 2009-11-16 00:46:38

+0

是的,我忘記了XQuery中的變量無法修改。 – Dmitry 2009-11-16 01:06:52

0

好了,這樣的事情應該返回的第一個元素作爲 - 是除了前面休息「」

<PhoneNumberList> 
{ 
    for $phone in $c//PhoneNumber[0] 
    return $phone 
    for $phone in $c//PhoneNumber[position()>0] 
    return concat(", ", $phone) 
} 
</PhoneNumberList> 
+1

您需要在兩個flwor表達式之間使用',',因爲這些是值,所以會自動插入空格。使這些flwor表達式返回文本節點,你應該在那裏,雖然它不是一個特別明確的解決方案。 – 2010-02-08 13:34:42

+0

感謝[位置()> 0]功能 – atur 2014-04-29 10:20:22

1

似乎有是一個很大的混亂與XQuery中的變量。 let表達式在每次評估時都會創建一個新變量,因此下面的「過程」方法將不起作用。

雖然字符串連接的解決方案是在您的情況最好的,正確的方式來寫這個「手工」是一個遞歸函數:

declare function local:join-numbers($numbers) 
{ 
    concat($numbers[1], ", ", local:join-numbers(substring($numbers,2))) 
}; 

<PhoneNumberList> 
{ 
    local:joinNumbers($c//PhoneNumber) 
} 
</PhoneNumberList>