• +49-(0)721-402485-12
Ihre Experten für XML, XQuery und XML-Datenbanken

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.

SignaturBeschreibung
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ückvor >>