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

Manipulation von Zeichenketten

Die Manipulation von Zeichenketten umfasst zum einen Funktionen zum Konkatenieren einzelner Stringwerte und zum anderen Funktionen zur Analyse und Umwandlung von Klein- in Großbuchstaben und umgekehrt. Die Funktion fn:concat() fügt alle Zeichenketten ohne weitere Trennsymbole zu einer einzelnen Zeichenkette zusammen. In Analogie dazu erlaubt die Funktion fn:string-join() die Konkatenation mit expliziter Angabe von Trennzeichen. Folgendes Beispiel illustriert die unterschiedliche Semantik:

let $a := xs:string("Frankenbergerstraße"),
$b := xs:string("5"),
$x := ("D", "1500", "Berlin")
return (
<KonkatenierteAdresse>
{fn:concat($a, $b, $x[1], $x[2], $x[3])}
</KonkatenierteAdresse>,
<VerknüpfteAdresse>
{fn:string-join(($a, $b), ""),
fn:string-join((fn:string-join(($x[1],$x[2]), "-"), $x[3]),
" ")}
</VerknüpfteAdresse>)

Diese Anfrage resultiert in folgendem Ergebnis, wobei aus Gründen der leichteren Lesbarkeit die Formatierung erhalten bleibt:

<KonkatenierteAdresse>
Frankenbergerstraße5D1500Berlin
</KonkatenierteAdresse>
<VerknüpfteAdresse>
Frankenbergerstraße5
D-1500 Berlin
</VerknüpfteAdresse>

Beim Einsatz der Funktionen zur Manipulation von Zeichenketten ist darauf zu achten, dass ein Argument eine Zeichenkette repräsentiert und nicht aus einer Sequenz von Elementen besteht. Das folgende Konstrukt würde somit zu einem Fehler führen:

let $a := xs:string("Frankenbergerstraße"),
$b := xs:string("5"),
$x := ("D", "1500", "Berlin")
return (
fn:concat($a, $b, $x)

Neben diesem funktionalen Unterschied hebt sich die Funktion fn:string-join() von der reinen Konkatenation dadurch ab, dass die zu verknüpfenden Stringwerte Elemente einer als Parameter erwarteten Sequenz sind. Dies eröffnet im praktischen Umgang weitere Möglichkeiten, indem als Parameter XQuery-Ausdrücke – und damit sowohl Pfad- als auch ganze FLWOR-Ausdrücke – eingesetzt werden können, die als Ergebnis eine Sequenz zurückliefern.

let $x := (<Adresse>
<Straße>Frankenbergerstraße</Straße>
<Hausnr>5</Hausnr>
<Stadt>Berlin</Stadt>
<Staat>D</Staat>
<PLZ>15000</PLZ>
</Adresse>)
return
fn:string-join($x/Adresse/*/fn:text(), " ")

oder alternativ mit einem FLWOR-Ausdruck

...
return
fn:string-join(for $y in $x
return fn:text(.), " ")

Die unten stehende Tabelle gibt einen Überblick über die exakten Signaturen sowohl der beiden betrachteten Funktionen zur Verknüpfung von Zeichenketten als auch über weitere Methoden zur Manipulation und Analyse von Stringwerten.

SignaturBeschreibung
fn:concat(
$arg1 as xs:string?,
$arg2 as xs:string?, ...)
as xs:string
fügt alle übergebenen Zeichenketten ohne
Trennzeichen zu einer Zeichenkette zusammen
fn:string-join(
$arg1 as xs:string*,
$arg2 as xs:string)
as xs:string
fügt alle Zeichenketten des ersten Parameters
mit dem Wert des zweiten Parameters als
Trennzeichen zu einer Zeichenkette zusammen
fn:string-length(
[$arg as xs:string])
as xs:integer
liefert die Länge der übergebenen Zeichenkette;
wird keine Zeichenkette übergeben, so wird die Länge
des über die Funktion fn:string() konvertierten
aktuellen Kontextknotens zurückgegeben
fn:upper-case(
$arg as xs:string?)
as xs:string
ersetzt – sofern möglich – alle Kleinbuchstaben
durch die entsprechenden Großbuchstaben
gemäß Unicode Case Mapping
fn:lower-case(
$arg as xs:string?)
as xs:string
ersetzt – sofern möglich – alle Großbuchstaben
durch die entsprechenden Kleinbuchstaben
gemäß Unicode Case Mapping

Tab. Funktionen zur Manipulation von Zeichenketten (Teil 1)

Die Funktionen fn:string-length(), fn:upper-case() und fn:lower-case() sind im Prinzip selbsterklärend. Die Form der Ermittlung einer Stringlänge ohne expliziten Parameter mag erwähnenswert sein, da in diesem Fall der aktuelle Kontextknoten nach einer Konvertierung in eine Zeichenkette als impliziter Parameter existiert. Zur Illustration mögen die folgenden Beispiele ausreichend sein:

let $x := (<Name>
<Vorname>Benjamin</Vorname>
<Nachname>Naumann</Nachname>
</Name>)
return
<Namensliste>
{
for $y in $x/*/fn:text()
return (
<NAME>{fn:upper-case($y)}</NAME>,
<name>{fn:lower-case($y)}</name>,
<Stringlänge>{fn:string-length($y)}</Stringlänge> )
}
</Namensliste>

Dieser FLWOR-Ausdruck liefert folgende Ausgabe:

<Namensliste>
<NAME>BENJAMIN</NAME>
<name>benjamin</name>
<Stringlänge>8</Stringlänge>
<NAME>NAUMANN</NAME>
<name>naumann</name>
<Stringlänge>7</Stringlänge>
</Namensliste>

Die Funktionen fn:upper-case() und fn:lower-case() richten sich nach der Unicode-Datenbank. Es gibt allerdings Buchstaben, für die diese Abbildung nicht eindeutig ist, sondern von der Sprache abhängt: Im Türkischen ist beispielsweise der Großbuchstabe zu "i" das Symbol "I" mit einem Punkt darauf! Unicode reagiert auf dieses Phänomen mit einem komplexen sprachabhängigen Regelwerk. XQuery berücksichtigt diese Sprachabhängigkeiten jedoch nicht.

 

Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)

<< zurückvor >>