2009-11-16 19 views
7

così ho dati XML come questo:XQuery: come aggiungere correttamente, nel ciclo for

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

e con questo XQuery:

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

ottengo:

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

Ma io in realtà voglio:

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

Qualcuno potrebbe far luce su come farlo?

risposta

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

oh mio dio..continua come una magia. Grazie! – sivabudh

-1

Che dire di questo?

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

ho provato in esecuzione che, ma ancora non aggiunge il ... come strano – sivabudh

+0

Sì, ho dimenticato che le variabili in XQuery non possono essere modificate. – Dmitry

0

Ok, qualcosa di simile dovrebbe restituire il primo elemento così com'è e il resto con anteposta ""

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

Avrai bisogno di un ',' tra le due espressioni flwor, e poiché questi sono valori, uno spazio verrà inserito automaticamente. Rendi queste espressioni flwor i nodi di testo e dovresti essere lì, sebbene non sia una soluzione particolarmente chiara. –

+0

grazie per la funzione [position()> 0] – atur

1

Sembra che ci sia un sacco di confusione con le variabili in XQuery . Un'espressione let crea una nuova variabile ogni volta che viene valutata, quindi gli approcci "procedurali" di seguito non funzioneranno.

Mentre la soluzione string-join è il migliore nel tuo caso, il modo corretto di scrivere questo "manuale" è con una funzione ricorsiva:

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

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