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 ""
Signatur | Beschreibung |
---|---|
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().
Signatur | Beschreibung |
---|---|
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ück | vor >> |