fn:tokenize

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 5.)

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

   

Kategorie: Stringfunktionen – Patternmatching

Herkunft: XPath 2.0

Rückgabewert: Eine Sequenz aus Strings xs:string; das Ergebnis des Zerle­gens des Eingabestrings in Segmente an den im regulären Ausdruck als Separa­toren bestimmten Grenzen.

Aufruf/Argumente:

fn:tokenize($eingabestring?, $reg-ex, $flags?)

$eingabestring:
Optional. Ein String xs:string, der anhand der im regulä­ren Ausdruck des zweiten Arguments spezifizierten Separatoren in eine Sequenz aus Teilstrings zerlegt werden soll – unter Wegfall der als Separatoren dienenden Teilstrings. Wird der Funktion als erstes Argument die leere Sequenz übergeben, so gibt sie die leere Sequenz zurück.

$reg-ex:
Obligatorisch. Das Argument besteht aus einem regulären Aus­druck (regular expression), der zur Prüfung des Strings herangezogen wird. Alle Instanzen des Separators, wie ihn der Reg-Ex beschreibt, werden bei der Zerle­gung entfernt.

$flags:
Optional. Mittels des Flags-Arguments kann die Wirkung des regu­lären Ausdrucks bestimmt werden. Wird kein Flags-Argument übergeben, so prüft der reguläre Ausdruck erstens »case-sensitive« und betrachtet zweitens den Eingabestring als geschlossene (nicht zeilenorientierte) Zeichenkette.

Verwendungszweck:

Die Funktion fn:tokenize() zerlegt einen ihr übergebenen String in eine Sequenz aus Teilstrings. Hierzu wird mittels eines regulären Ausdrucks ein Separatormuster beschrieben, bei dessen Auftreten der jeweils vorangehende Teilstring (bis zu einem diesem vorausgehenden Separatormatch) kopiert und als String der Ergebnissequenz hinzugefügt wird. Der durch das Muster gefundene Separator erscheint nicht in der Ergebnisse­quenz.

Tritt ein Patternmatch unmittelbar am Beginn des Eingabestrings auf, so ist das erste Item der Ergebnissequenz folgerichtig der leere String.

Folgen zwei Separatoren (also Patternmatches) unmittelbar aufeinander, ohne sich zu überlappen, wird ebenfalls ein leerer String als Item der Ergebnissequenz hinzugefügt.

Überlappen sich hingegen zwei Patternmatches und daher auch zwei potenzi­elle Separatoren (z.B. durch im Reg-Ex enthaltene Gruppen), so wird nur der erste Match verwendet – die Reihenfolge der Gruppen ist relevant:

fn:tokenize("abracadabra", "(ab)|(a)")

ergibt

("", "r", "c", "d", "r", "")

Hingegen führt

fn:tokenize("abracadabra", "(a)|(ab)")

zu folgendem Ergebnis:

("", "br", "c", "d", "br", "")

Setzen von Flags mit dem $flags-Argument:

Um das Verhalten des regulären Ausdrucks zu modifizieren, darf zusätzlich zum Eingabestring und dem regulären Ausdruck als drittes Argument ein String als sogenanntes »Flag« übergeben werden. Die erlaubten Flags sind an die Konventionen von Perl angelehnt.

Achtung – Abweichung zu Flags in Perl-Syntax:
Das Perl-Flag g (»global«) wird in XPath nicht unterstützt!

Das Argument darf aus den Einzelbuchstaben m, i, s, x oder (in unbestimmter Reihenfolge) aus sinnvollen Kombinationen von diesen besteht. Auch der leere String (bzw. die leere Sequenz) ist gestattet. Ein ungültiges (also von den erlaubten Zeichen abweichendes) Flag-Argument quittiert der Prozessor mit der Fehlermeldung »Invalid regular expression. flags« (err:FORX0001).

Flagsymbol Beschreibung

i

»ignore« – ignoriert für die Matches die Groß-/Kleinschreibung im untersuchten String.

m

»multiline« – beachtet Zeilenumbrüche im untersuchten String (erlaubt einen mehrfachen Match durch die Pattern ^ und $). 

s

Schaltet in den sogenannten »dot-all« Modus um.

Erläuterung: Beeinflusst wird das Verhalten des Metazeichens ».« ( dot) – ohne gesetztes s-Flag trifft dieses Metazeichen auf alle Zeichen (auch Whitespace!) zu, außer auf das Zeilenumbruchzeichen #x0A (NL).

x

Deaktiviert die Beachtung der Whitespace-Zeichen #x9, #xA, #xD und #x20 innerhalb des regulären Ausdrucks. Ist das Flag nicht gesetzt, werden Whitespace-Zeichen hingegen als Teil des Ausdrucks betrachtet und für den Match berücksichtigt.

Erläuterung: Das gesetzte Flag x ermöglicht, längere reguläre Ausdrücke durch den Einsatz von Zeilenumbrüchen und Tabulatoren übersichtlicher zu gestalten.

''

Der leere String – dieser ist als Wert ausdrücklich gestattet. Er entspricht der Nicht-Übergabe eines Flag-Arguments.

Tabelle: In XPath für Flags in regulären Ausdrücken erlaubte Symbole.

Weitere Erläuterungen zu regulären Ausdrücken an anderer Stelle
Weitere Erläuterungen zu regulären Ausdrücken finden Sie bei fn:matches() und bei fn:replace().

Beispiele:

Beispiel 1 – Einen String in Worte zerlegen:

fn:tokenize( "Das  ist    ein Beispiel", 
             "\s+"
  )

ergibt ("Das", "ist", "ein", "Beispiel")

Der reguläre Ausdruck passt auf eine Folge von einem oder mehreren Weiß­raumzeichen und definiert diese als Separatoren. Hier werden daher die im String enthaltenen Wörter zu Items in der Ergebnissequenz. Alle Leerzeichen werden hierbei entfernt.

Beispiel 2 – In Stringform vorliegende kommaseparierte Liste zerlegen:

fn:tokenize( "1,     15,   24,50", 
             ",\s*"
  )

ergibt ("1", "15", "24", "50")

Hier werden in Stringform vorliegende kommaseparierte Zahlenwerte in eine »echte« Sequenz umgewandelt. Der reguläre Ausdruck ",\s*" erkennt Kom­mas mit einer beliebigen Anzahl folgender Leerzeichen als Separatoren.

Beispiel 3 – Einen String in Zeichen zerlegen (Version 1):

fn:tokenize( "Test", 
             ".??"
  )

ergibt ("", "T", "e", "s", "t")

Der Reg-Ex ".??" bewirkt die Zerlegung des Strings in eine Sequenz aus einzel­nen Zeichen. Der Reg-Ex passt auf alle Zeichen und Nicht-Zeichen – und soll den leeren String als Separator verwenden. Hierfür ist es wichtig, den Quanti­fizierer ? durch ein weiteres nachgestelltes '?' als nicht gierig (reluctant) zu deklarieren, da sonst nicht lediglich der leere String (der jedem Zeichen voran­geht) als Separator verwendet wird, sondern auch das jeweils folgende Zeichen (das dann entfernt würde). Ansonsten würde die Ergebnissequenz nur aus lee­ren Strings bestehen.

Die Ergebnissequenz beginnt unschönerweise mit einem leeren String, da der erste Match am Anfang des String erfolgt. (Eine Folge der Vorstellung, dass jedem String ein leerer String vorangeht, der zurückgegeben wird, wenn der Match auf das erste Zeichen erfolgt.)

Beispiel 4 – Einen String in Zeichen zerlegen (Version 2):

fn:tokenize( "Test", 
             "B\.??"
  )

ergibt ("T", "e", "s", "t")

Das vorige Beispiel wurde insofern modifiziert, als dass der Separator nicht am Anfang des Strings auftreten darf – exakter muss er an einer Nicht-Wortgrenze \B gefunden werden. Dies eliminiert das Auftreten des störenden leeren Strings als erstes Item in der Ergebnissequenz. (Leerzeichen dürfen im Eingabe­string in diesem Beispiel nicht enthalten sein, sonst müsste der Reg-Ex komple­xer sein.)

Beispiel 5 – String an HTML-Breaks zerlegen:

fn:tokenize( "Das ist <br> ein <BR> Beispiel",
             "\s*<br>\s*",
             "i"
   
)

ergibt ("Das ist", "ein", "Beispiel")

Das gesetzte Flag "i" bewirkt in Zusammengang mit dem regulären Ausdruck "\s*<br>\s*", dass ein HTML-Tag <br> mit beliebig vielen umgebenden Leer­zeichen sowohl in Groß- als auch in Kleinschreibweise gefunden und als Sepa­rator erkannt wird.

Funktionsdefinition:

XPath 1.0:
Funktion nicht verfügbar

XPath 2.0:

fn:tokenize($input as xs:string?,
            $pattern as xs:string) as xs:string*

fn:tokenize($input as xs:string?,
            $pattern as xs:string,
            $flags as xs:string) as xs:string*

 

   

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn