Veränderung von Sequenzen
Die Verkettung von Sequenzen mit dem Kommaoperator haben wir bereits kennen gelernt. Mit diesem Operator kann man auch einzelne Einträge an eine Sequenz anfügen:
let $seq := (1, 2, 3)
return ($seq, 4)
liefert:
(1, 2, 3, 4)
Es ist mittels der Funktion fn:insert-before() auch möglich, an anderen Stellen der Sequenz Einträge einzufügen. Das Löschen von Einträgen kann mit fn:remove() erreicht werden. Dabei wird jeweils die betreffende Position angegeben. Folgendes Beispiel ersetzt den Eintrag an Position 3 durch den Eintrag "Neu".
let $seq := ("E1", "E2", "E3", "E4", "E5")
return fn:insert-before(fn:remove($seq, 3), 3, "Neu")
Ergebnis:
("E1", "E2", "Neu", "E4", "E5")
Die Reihenfolge der Einträge in einer Sequenz kann mit fn:reverse() umgedreht werden. Schließlich kann man mit fn:subsequence() einen Ausschnitt aus einer Sequenz bilden, indem Startposition und Anzahl der Elemente angegeben werden. Diese beiden Angaben sind hier Werte vom Typ xs:double. Sie werden zunächst gerundet, um auf Werte des Typs xs:integer zu kommen. Wenn die Angabe einer Anzahl fehlt, wird die Eingabesequenz ab der Startposition bis zum Ende ausgegeben. Beispielsweise ergibt folgender Ausdruck:
let $seq := (6,5,4,3,2,1,0)
return subsequence(($seq, fn:reverse($seq)),
fn:count($seq) div 2,
fn:count($seq))
die Sequenz
(3,2,1,0,0,1,2)
Eine besondere Rolle spielt die Funktion fn:unordered(). Sie repräsentiert lediglich den Verzicht auf eine bestimmte Reihenfolge. Eine XQuery-Implementierung kann dies zur Optimierung verwenden. So kann beispielsweise bei einer Vereinigung von Sequenzen mit dem Operator union darauf verzichtet werden, die Dokumentreihenfolge herzustellen:
fn:unordered($seq1 union $seq2)
Die folgende Tabelle gibt eine Übersicht über die besprochenen Funktionen.
Signatur | Beschreibung |
---|---|
fn:insert-before( $seq as item()*, $position as xs:integer, $seqneu as item()*) as item()* | liefert eine neue Sequenz, bei der die Einträge aus der Sequenz $seqneu an Position $position in die Sequenz $seq eingeschoben wurden; ist $position größer als die Anzahl der Einträge in $seq, wird $seqneu an $seq angehängt; hat $position den Wert 1 oder kleiner, wird $seqneu den Einträgen aus $seq vorangestellt |
fn:remove( $seq as item()*, $position as xs:integer) as item()* | liefert eine neue Sequenz, die daraus entsteht, dass in $seq der Eintrag an Position $position entfernt wird; bei ungültigen Positionsangaben wird $seq zurückgegeben |
fn:reverse( $seq as item()*) as item()* | liefert eine neue Sequenz mit allen Einträgen aus $seq in umgekehrter Reihenfolge |
fn:subsequence( $seq as item()*, $start as xs:double[, $length as xs:double]) as item()* | liefert eine neue Sequenz, beginnend mit dem Eintrag an Position round($start) in $seq; der ganze Rest von $seq wird geliefert, wenn $length fehlt, sonst werden nur round($length)Einträge zurückgegeben |
fn:unordered( $seq as item()*) as item()* | liefert eine Sequenz, die alle Einträge aus $seq enthält, wobei deren Reihenfolge unbestimmt ist |
Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)
<< zurück | vor >> |