2009-11-16 15 views
7

Así que tiene datos XML como este:XQuery: cómo anexar correctamente, en el bucle for

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

y con este XQuery:

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

me sale:

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

Pero en realidad quiero:

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

¿Podría alguien arrojar algo de luz sobre cómo hacer esto?

Respuesta

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

oh dios mio ... funciona como magia. ¡Gracias! – sivabudh

-1

¿Qué tal esto?

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

Intenté funcionar, pero aún así no añadir el, ... qué extraño. – sivabudh

+0

Sí, olvidé que las variables en XQuery no se pueden modificar. – Dmitry

0

Ok, algo como esto debería devolver el primer elemento como está y el resto con antepuesto ""

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

Querrá un ',' entre las dos expresiones flwor, y dado que estos son valores, se insertará un espacio automáticamente. Haz que estas expresiones flwor devuelvan nodos de texto y deberías estar ahí, aunque no es una solución particularmente clara. –

+0

gracias por [position()> 0] function – atur

1

No parece haber mucha confusión con las variables en XQuery . Una expresión let crea una nueva variable cada vez que se evalúa, por lo que los enfoques "procedurales" a continuación no funcionarán.

Mientras que la solución de cadena de unión es el mejor en su caso, la forma correcta de escribir este "manual" es una función recursiva:

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

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