Reguläre Ausdrücke nutzen

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie haben gehört, dass reguläre Ausdrücke (Regex, regular expressions) ein leistungsstarkes neues Werkzeug in XSLT 2.0 sind. Allerdings sind Sie sich nicht sicher, wie Sie diese Leistung für sich nutzen können.

Lösung

Textmuster erfassen

Die grundlegendste Anwendung regulärer Ausdrücke besteht in der Erfassung oder Filterung von Textmustern. Sie können matches( ) in einem Template-Muster verwenden, um die Filtermöglichkeiten von XSLT auf den Text eines Knotens zu erweitern:

<!-- Ein Datum der Form May 3, 1964 --> 
<xsl:template match="birthday[matches(.,'^[A-Z][a-z]+\s[0-9]+,\s[0-9]+$')]"> 
  <!-- ... --> 
</xsl:template> 

<!-- Ein Datum der Form 1964-05-03 --> 
<xsl:template match="birthday[matches(.,'^[0-9]+-[0-9]+-[0-9]+$')]"> 
  <!-- ... --> 
</xsl:template> 

<!-- Ein Datum der Form 3 May 1964 --> 
<xsl:template match="birthday[matches(.,'^[0-9]+\s[A-Z][a-z]+\s[0-9]+$')]"> 
  <!-- ... --> 
</xsl:template>

Alternativ können Sie Filter in einer xsl:if- oder einer xsl:choose-Anweisung verwenden:

<xsl:choose>
  <xsl:when test="matches($date,'^[A-Z][a-z]+\s[0-9]+,\s[0-9]+$')"> </xsl:when>
  <xsl:when test="matches($date,'^[0-9]+-[0-9]+-[0-9]+$')"> </xsl:when>
  <xsl:when test="matches($date,'^[0-9]+\s[A-Z][a-z]+\s[0-9]+$')"> </xsl:when>
</xsl:choose>

Text in Token zerlegen

Oft werden reguläre Ausdrücke verwendet, um einen String in Token zu zerlegen:

(: Ein ISO-Datum (YYYY-MM-DD) in eine Sequenz aufteilen, die aus Jahr, Monat, Tag besteht :)
tokenize($date, '-')

(: Ein ISO-DatumUhrzeit (YYYY-MM-DDThh:mm:ss) in eine Sequenz aufteilen, die aus Jahr, Monat, Tag, Stunde, Minute, Sekunde besteht :)
tokenize($date, '-|T|:')

(: Eine Sequenz in Wörter aufteilen :)
tokenize($text, '\W+')

Text ersetzen und erweitern

Es gibt zwei Möglichkeiten, die XPath-Funktion replace( ) zu verwenden.

Die erste besteht einfach darin, Muster in einem String durch anderen Text zu ersetzen. Manchmal ersetzen Sie das Muster durch den leeren String (''), weil Sie einfach nur den Text entfernen wollen, der dem Muster entspricht:

(: Ersetzen des Tages in einem ISO-Datum durch 01 :)
replace($date,'\d\d$','01')

(: Entfernen aller Elemente bis auf das Jahr in einem ISO-Datum :)
replace($date,'-\d\d-\d\d$','')

Die zweite Methode, replace zu verwenden, besteht darin, Text an der Stelle in den String einzufügen, an der das Muster gefiltert wird, dabei aber den gefilterten Teil unverändert zu lassen. Es scheint nicht sehr intuitiv zu sein, dass Sie eine Funktion namens replace verwenden können, um eine Einfügung vorzunehmen, allerdings ist dies genau die Wirkung, die Sie erzielen, indem Sie Rückbezugsvariablen verwenden.

(: Einfügen eines Leerzeichens nach Interpunktionszeichen, hinter denen ein Leerzeichen fehlt :)
replace($text, '([,;:])\S', '$1 ')

Text parsen, um ihn in XML zu konvertieren

Leistungsfähiger als tokenize( ) oder replace( ) ist die neue XSLT 2.0-Anweisung xsl:analyze-string. Diese Funktion erlaubt es Ihnen, über die Textersetzung hinauszugehen und aus Text neuen XML-Inhalt zu erstellen. Unter Das Potenzial von XSLT 2.0 ausnutzen finden Sie Rezepte für die Anwendung von xsl:analyze-string.

Diskussion

Reguläre Ausdrücke (oder einfach Regex) stellen solch ein umfassendes und leistungsfähiges Werkzeug zur Textverarbeitung dar, dass man ein ganzes Buch schreiben könnte, das sich nur damit befasst. Das hat sogar schon jemand getan. Jeffrey E. F. Friedls Buch Reguläre Ausdrücke ist ein Klassiker auf diesem Gebiet, den ich sehr empfehle.

Reguläre Ausdrücke beziehen ihre Stärke aus der Mustererfassung. Interessanterweise ist die Mustererfassung auch die wichtigste Leistung von XSLT. Während XSLT ideal dafür geeignet ist, Muster in der Struktur eines XML-Dokuments zu erfassen, sind reguläre Ausdrücke für die Erfassung von Mustern in Ad-hoc-Text optimiert. Allerdings ist die Mustersprache regulärer Ausdrücke komplexer als die in XSLT verwendeten XPath-Ausdrücke. Das ist einfach unvermeidlich, da dem Ad-hoc-Text die einheitliche Baumstruktur von XML fehlt.

Die Schlüssel zur Bewältigung regulärer Ausdrücke sind Übung und die vernünftige Übernahme von Beispielausdrücken, die andere entworfen haben. Neben Friedls Buch finden Sie Beispielausdrücke in vielen Perl-Büchern sowie online unter RegExLib.com.

  

<< zurück vor >>

 

 

 

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

Copyright © 2006 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT Kochbuch" 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.

O'Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de