2009-11-16 20 views
7

Więc muszę danych XML tak:XQuery: Jak prawidłowo dodać, w pętli for

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

i z tym XQuery:

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

uzyskać:

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

Ale ja naprawdę chcę:

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

Czy ktoś mógłby rzucić trochę światła na to, jak to zrobić?

Odpowiedz

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

o mój boże ... działa jak magia. Dzięki! – sivabudh

-1

Co z tym?

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

Próbowałem uruchomiony, ale to nadal nie dodaje ..., jak dziwnie. – sivabudh

+0

Tak, zapomniałem, że zmienne w XQuery nie mogą być modyfikowane. – Dmitry

0

Ok, coś takiego powinno wrócić do pierwszego elementu jak jest, a reszta z dołączany na początku „”

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

Będziesz potrzebował ',' między dwoma wyrażeniami flwor, a ponieważ są to wartości, spacja zostanie wstawiona automatycznie. Niech te wyrażenia flowy zwrócą węzły tekstowe i powinieneś tam być, chociaż nie jest to szczególnie jasne rozwiązanie. –

+0

dzięki za [position()> 0] function – atur

1

Nie wydaje się być dużo zamieszania ze zmiennych w XQuery . Wyrażenie let tworzy nową zmienną za każdym razem, gdy jest oceniany, więc poniższe "proceduralne" podejścia nie będą działać.

Choć rozwiązanie ciąg dołącz jest najlepszy w danym przypadku, prawidłowy sposób napisać to „ręcznie” to z funkcji rekurencyjnej:

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

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