2009-11-16 1 views
7

ためにだから私はこのようなXMLデータがあります。のXQuery:どのように適切に追加するには、ループ

<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

-1

これはどうですか?

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

私はそれを実行しようとしたが、それはまだ追加されません。 ...、奇妙な。 – sivabudh

+0

はい、XQueryの変数は変更できないことを忘れていました。 – Dmitry

0

[OK]を、このようなものは、あるとして最初の要素を返し、プリペンドと休息すべきである「」

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

2つのflwor式の間に '、'が必要です。これらは値であるため、スペースが自動的に挿入されます。これらのflwor式がテキストノードを返すようにしてください。特に明確な解決策ではありませんが、そこにいるはずです。 –

+0

[位置()> 0]機能ありがとう – atur

1

のXQueryの変数に多くの混乱があるようです。 let式は評価されるたびに新しい変数を作成するので、以下の「手続き型」アプローチは機能しません。

文字列-参加ソリューションは、あなたのケースでは最高であるが、この「手動」を書き込むための正しい方法は再帰関数である:

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

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