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

Substitution und Konvertierung von Zeichenketten

Wie bereits gezeigt, können Zeichenketten mit vordefinierten XQuery-Funktionen umfangreich bearbeitet werden. Funktionen, die Substitution und Konvertierung von Zeichenketten erlauben, werden im Folgenden vorgestellt.

Die Funktion fn:substring() beispielsweise liefert als Ergebnis den Teilstring (mit optional anzugebender maximaler Länge) des ersten Parameters ab der Position, die im zweiten Parameter zu spezifizieren ist (siehe Tabelle). Das erste Zeichen im Stringwert hat dabei die Position 1; Positionsangaben < 1 bedeuten, dass ab dem ersten Zeichen zurückgegeben wird. Negative Längenangaben resultieren in einem Stringwert der Länge 0. Folgende Beispielausdrücke illustrieren die Semantik der fn:substring()-Funktion:

fn:substring("Bluttransfusion", 5) liefert "transfusion"
fn:substring("Bluttransfusion", 4, 2) liefert "tt"
fn:substring("Bluttransfusion", 37, 2) liefert ""
fn:substring("Bluttransfusion", -1, -1) liefert ""

SignaturBeschreibung
fn:substring(
$sourceString as xs:string?,
$startingLoc as xs:double[,
$length as xs:double])
as xs:string
liefert den Teil des ersten Parameters ab der
im zweiten Parameter angegebenen Position;
wird kein dritter Parameter angegeben, so ist
die Länge des Rückgabewertes nicht beschränkt
fn:translate(
$arg as xs:string?,
$mapString as xs:string,
$transString as xs:string)
as xs:string
führt eine Ersetzung in der als ersten Parameter
übergebenen Zeichenkette durch, wobei
jeder Buchstabe durch einen Buchstaben aus dem
dritten Parameter durch Anwendung der Maske
(zweiter Parameter) substituiert wird

Tab. Funktionen zur Manipulation von Zeichenketten (Teil 2)

Zum anderen können Zeichenketten mit Hilfe der Funktion fn:translate() verarbeitet werden. Dabei werden die Zeichen in der Originalzeichenkette (1. Parameter), die eine Zuordnung in der Maske (2. Parameter) besitzen, durch Zeichen des Ersetzungsstrings (3. Parameter) ersetzt. Zum Beispiel können durch folgenden Funktionsaufruf in der Zeichenkette "Winterbergstraße" alle Buchstaben "r" durch ein "l" ersetzt werden:

fn:translate("Winterbergstraße", "r", "l")
liefert "Wintelbelgstlaße"

Die Ersetzungsmöglichkeit kann dabei in zwei Richtungen erweitert werden. Zum einen kann die Maske mehrere Zeichen umfassen, die jeweils durch das hinsichtlich der Position korrespondierende Zeichen im Ersetzungsstring ersetzt werden. Zum anderen können einzelne Zeichen (am Ende der Maske) durch Weglassen eines Ersetzungszeichens aus dem Originalstring eliminiert werden.

fn:translate("Winterbergstraße", "e", "EL")
liefert "WintELbELgstLaßE"

fn:translate("Winterbergstraße", "Wre", "Hl")
liefert "Hintlblgstlaß"

Als Sonderform der fn:translate()-Funktion kann bis zu einem bestimmten Grad die Normalisierung von Zeichenketten angesehen werden. Der Bereich der "Normalisierung" umfasst im weitesten Sinne die drei Funktionen fn:normalize-space(), fn:normalize-unicode() und fn:escape-uri().

SignaturBeschreibung
fn:normalize-space(
[$arg as xs:string?])
as xs:string
eliminiert sowohl alle doppelten Leerzeichen
als auch Leerzeichen am Anfang und Ende
der Zeichenkette
fn:normalize-unicode(
$arg as xs:string?[,
$normalizationForm as xs:string])
as xs:string
normalisiert die übergebene Zeichenkette
hinsichtlich eines angegebenen Normalisierungs-
formates; standardmäßig – ohne zusätzlichen
Parameter – nach NFC
fn:escape-uri(
$uri-part as xs:string?,
$escape-reserved as xs:boolean)
as xs:string
führt eine Konvertierung der Zeichenkette
durch, so dass alle Sonderzeichen durch eine
Escape-Sequenz der Form %HH
ersetzt werden

Tab. Funktionen zur Manipulation von Zeichenketten (Teil 3)

Die fn:translate() am naheliegendste Funktion fn:normalize-space() eliminert in einem übergebenen Stringwert bzw. – falls kein Parameter explizit angegeben ist – in dem Stringwert des aktuellen Kontextknotens alle doppelten Leerzeichen sowie alle Leerzeichen am Anfang und Ende der Zeichenkette. Darüber hinaus werden alle weiteren Leerraumzeichen wie CR, LF, TAB durch ein Leerzeichen ersetzt.

Die dritte Funktion, die eine Ersetzung in Zeichenketten mit vordefinierter Semantik erfüllt, ist fn:escape-uri(). Dabei werden alle Sonderzeichen zur Darstellung einer URI in eine hexadezimale Repräsenation der Form %HH überführt. Der zusätzliche boolesche Parameter bestimmt dabei den Umfang der zu ersetzenden Sonderzeichen:

  • $escape-reserved = true
    Alle Zeichen außer "a-z", "A-Z", "0-9" und "%,#-_.!~*'()" werden konvertiert.
  • $escape-reserved = false
    Alle Zeichen außer "a-z", "A-Z", "0-9", "%,#-_.!~*'()" und zusätzlich ";/?:@&=+$,[]" werden konvertiert.

Im Allgemeinen gilt die Faustregel, dass eine Konvertierung mit $escape-reserved = true erfolgen soll, wenn ein Teil einer URI geformt werden soll, und false, wenn eine vollständige URI bzw. eine URI-Referenz erstellt werden soll. Folgendes Beispiel illustriert den Unterschied bei der Ersetzung von Sonderzeichen:

fn:escape-uri("http://www.xquery-buch.de/
Patient Adam Schmidt#befund", fn:false())

liefert

"http://www.xquery-buch.de/Patient%20Adam%20Schmidt#befund"

fn:escape-uri("http://www.xquery-buch.de/
Patient Adam Schmidt#befund", fn:true())

liefert

"http%3A%2F%2Fwww.xquery-buch.de%2F
Patient%20Adam%20Schmidt%23befund"

 

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

<< zurückvor >>