Ohne reguläre Ausdrücke auskommen

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie wollen Regex-artige Operationen in XSLT 1.0 ausführen, möchten aber nicht auf nicht-standardisierte Erweiterungen zurückgreifen.

Lösung

Mehrere gebräuchliche Regex-artige Filter können in nativem XPath 1.0 emuliert werden. Die folgende Tabelle listet diese auf, indem Perl-Syntax zusammen mit ihrem XSLT/XPath-Äquivalent verwendet wird. Das einzelne Zeichen »C« ist ein Platzhalter für ein vom Benutzer angegebenes einzelnes Zeichen, und der String »abc« ist ein Platzhalter für einen vom Benutzer angegebenen String mit einer Länge größer null.

Tabelle: Regex-Filter.

PerlXSLT/XPath
$string =~ /^C*$/ translate($string,'C','') = ''
$string =~ /^C+$/ $string and translate($string,'C', '') = ''
$string =~ /C+/ contains($string,'C')
$string =~ /C{2,4}/ contains($string,'CC') and not(contains($string,'CCCCC'))
$string =~ /^abc/ starts-with($string,'abc')
$string =~ /abc$/ substring($string, string-length($string) – string-length('abc') + 1) = 'abc'
$string =~ /abc/ contains($string,'abc')
$string =~ /^[^C]*$/ translate($string,'C','') = $string
$string =~ /^\s+$/ not(normalize-space($string))
$string =~ /\s/ translate(normalize-space($string),' ','') != $string
$string =~ /^\S+$/ translate(normalize-space($string),' ','') = $string

Diskussion

Wenn es um Kürze und Leistung geht, dann ist eine gute Regex-Engine kaum zu übertreffen. Allerdings können viele einfache Filteroperationen durch sperrigere, aber dennoch effektive XPath-Ausdrücke emuliert werden. Viele dieser Filter werden durch translate( ) ermöglicht, das irrelevante Zeichen entfernt, sodass der Filter als Gleichheitstest implementiert werden kann. Eine weitere nützliche Anwendung von translate ist die Fähigkeit, die Anzahl der Vorkommen eines bestimmten Zeichens oder einer bestimmten Menge von Zeichen zu ermitteln. Beispielsweise zählt der folgende Code die numerischen Zeichen in einem String:

string-length(translate($string, translate($string,'0123456789',''),''))

Falls unklar ist, was dieser Code tut, schauen Sie in das Rezept Bestimmte Zeichen aus einem String entfernen. Alternativ können Sie Folgendes schreiben:

string-length($string) - string-length(translate($string,'0123456789',''))

Dieser Code tauscht einen translate( )-Aufruf für ein zusätzliches string-length( ) und eine Subtraktion ein. Er könnte etwas schneller sein.

Ein wichtiges Kriterium, in dem sich diese XPath-Ausdrücke von ihren Perl-Gegenstücken unterscheiden, ist die, dass in Perl als Nebenwirkung der Filterung besondere Variablen gesetzt werden. Diese Variablen erlauben leistungsstarke Stringverarbeitungstechniken, die über den Rahmen von XSLT hinausgehen. Falls irgendjemand versuchen würde, Perl und XSLT zu einer hybriden Sprache zu vereinen, wäre ich einer der ersten Alpha-Tester!

Die gute Nachricht ist, dass XPath 2.0 nun reguläre Ausdrücke unterstützt. Ich behandele diese willkommene Erweiterung als Nächstes im Rezept Reguläre Ausdrücke nutzen.

  

<< 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