2009-11-16 4 views
7

donc j'ai données xml comme ceci:XQuery: comment ajouter correctement, en boucle

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

et avec ce XQuery:

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

Je reçois:

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

Mais je veux vraiment:

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

Quelqu'un pourrait-il nous éclairer sur la façon de faire cela?

Répondre

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

oh mon dieu .. fonctionne comme de la magie. Merci! – sivabudh

-1

Que pensez-vous de cela?

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

i essayé de courir, mais ça ne marche toujours pas ajouter le, ... comme c'est bizarre. – sivabudh

+0

Oui, j'ai oublié que les variables dans XQuery ne peuvent pas être modifiées. – Dmitry

0

Ok, quelque chose comme cela devrait revenir le premier élément comme ça, et le reste avec Prepended « »

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

Vous aurez besoin d'un ',' entre les deux expressions flwor, et puisque ce sont des valeurs, un espace sera inséré automatiquement. Faites en sorte que ces expressions floues renvoient des nœuds de texte et vous devriez être là, bien que ce ne soit pas une solution particulièrement claire. –

+0

merci pour [position()> 0] fonction – atur

1

Il semble y avoir beaucoup de confusion avec des variables dans XQuery . Une expression let crée une nouvelle variable chaque fois qu'elle est évaluée, ainsi les approches "procédurales" ci-dessous ne fonctionneront pas.

Alors que la solution de chaîne de rejoindre est le meilleur dans votre cas, la manière correcte d'écrire ce « manuellement » est une fonction récursive:

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

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