2016-04-22 9 views
1

Wenn a = A, B, C und b = 1,2,3 dann in XQuery I aufeinander folgenden Schleifen wie haben:Alternating (Verschachtelung?) Zwei XQuery Für Schleifen

{for $x in a 
return $x} 

{for $y in b 
return $y} 

welche A zurückkehren , B, C, 1,2,3

Oder I wie Schleifen verschachtelt sein können:

{for $x in a 
return $x 
    for $y in b 
    return $y}} 

die A1, A2, A3, B1, B2, B3, C1, C2 zurückkehren würde, C3 (oder vielleicht umgekehrt, aber Sie wissen, was ich meine).

Aber was ich brauche, ist A zurückzukehren, 1, B 2, C, 3

ich kämpfen, um eine Möglichkeit zu sehen, zwei Schleifen haben, aber die Ergebnisse von ihnen in meiner Ausgabe wechseln . Irgendwelche Vorschläge? Ich habe nach einer Lösung gesucht, bin aber kein XQuery-Experte und bin mir nicht einmal sicher, ob ich die richtige Terminologie verwende.

+0

Sind die Sequenzen 'a' und' b' garantiert gleich lang? Wenn dies der Fall ist, können Sie über 1 iterieren und die Position dieser Schleife verwenden, um den Wert an derselben Position in der anderen Sequenz zu erhalten. – wst

Antwort

1

Sie die Position des Iterators in der ersten Sequenz verwenden, um den Wert an der gleichen Position in der zweiten Sequenz zu erhalten:

for $x at $pos in a 
let $y := b[$pos] 
return ($x, $y) 
3

In XQuery 3.0 gibt es die höhere Ordnung Funktion fn:for-each-pair($seq1, $seq2, $f) die wendet eine vom Benutzer bereitgestellte Funktion auf den ersten, zweiten usw. Gegenstand der zwei Eingabesequenzen $f($seq1[1], $seq2[1]), $f($seq1[2], $seq2[2]), ... an, bis eine der Sequenzen erschöpft ist. Für Ihren Anwendungsfall möchten Sie nur Sequenzverkettung:

fn:for-each-pair(('A', 'B', 'C'), (1, 2, 3), function($a, $b) { $a, $b })