Bestimmte Zeichen aus einem String entfernen

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie wollen bestimmte Zeichen (z.B. Whitespace) aus einem String entfernen.

Lösung

XSLT 1.0

Benutzen Sie translate mit einem leeren Ersatzstring. Beispielsweise kann der folgende Code Whitespace aus einem String entfernen:

translate($input," 	
&xd;", "")

XSLT 2.0

Auch in XSLT 2.0 bietet sich der Einsatz von translate() an, da es normalerweise am besten funktioniert. Manchmal lassen sich jedoch die Aufgaben zum Entfernen von Strings natürlicher mit Hilfe regulärer Ausdrücke und der neuen replace()-Funktion implementieren:

(: \s erfasst alle Whitespace-Zeichen :)

replace($input,"\s","")

Diskussion

translate() ist eine vielseitige Stringfunktion, die häufig verwendet wird, um die fehlenden Möglichkeiten zur Stringverarbeitung in XSLT 1.0 zu kompensieren. Hier nutzen Sie die Tatsache aus, dass translate() keine Zeichen in den Eingabestring kopiert, die sich im from-String befinden, aber kein korrespondierendes Zeichen im to-String haben.

Sie können translate() auch einsetzen, um alle bis auf eine bestimmte Menge von Zeichen aus einem String zu entfernen. Beispielsweise löscht der folgende Code alle nicht-numerischen Zeichen aus einem String:

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

Das innere translate() entfernt alle gewünschten Zeichen (z.B. Zahlen), um einen from-String für das äußere translate() zu beziehen, das diese nicht-numerischen Zeichen aus dem Originalstring entfernt.

Manchmal wollen Sie nicht alle Vorkommen von Whitespace entfernen, sondern nur führenden, abschließenden und redundanten internen Whitespace. XPath besitzt eine integrierte Funktion, normalize-space(), die genau das tut. Falls Sie jemals auf der Grundlage anderer Zeichen als Whitespace normalisieren müssen, dann könnten Sie den folgenden Code benutzen (bei dem C das Zeichen ist, das Sie normalisieren wollen):

translate(normalize-space(translate($input,"C "," C")),"C "," C")

Diese Transformation funktioniert allerdings nicht richtig, wenn der Eingabestring andere Whitespace-Zeichen als Leerzeichen enthält, d. h. Tabulator- (#x9), Newline- (#xA) und Carriage-Return-Zeichen (#xD). Das liegt daran, dass der Code Leerzeichen mit dem zu normalisierenden Zeichen tauscht, die resultierenden Leerzeichen dann normalisiert und anschließend zurücktauscht. Wenn nach der ersten Transformation Nicht-Leerzeichen-Whitespace verbleibt, wird dieser ebenfalls normalisiert, was Sie vermutlich nicht wollen. Allerdings kommen Anwendungen der Nicht-Whitespace-Normalisierung wahrscheinlich sowieso selten vor. Hier verwenden Sie diese Technik, um zusätzliche --Zeichen zu entfernen:

<xsl:template match="/">
  <xsl:variable name="input" select=" '---dies --ist-- die Methode zum Normalisieren von Nicht-Whitespace---' "/>
  <xsl:value-of select="translate(normalize-space(translate($input,'- ',' -')),'- ',' -')"/>
</xsl:template>

Das Ergebnis lautet:

dies -ist- die Methode zum Normalisieren von Nicht-Whitespace

XSLT 2.0

Eine andere, leistungsfähigere Methode, um unerwünschte Zeichen aus einem String zu entfernen, besteht in der Anwendung der XSLT 2.0-Funktion replace(), die auf reguläre Ausdrücke zurückgreift. Wir verwenden replace() hier, um Nicht-Whitespace zu normalisieren, ohne dass die potenziellen Probleme unserer XSLT 1.0-Lösung drohen:

<xsl:template match="/">
  <xsl:variable name="input" select=" '---dies --ist-- die Methode zum Normalisieren von Nicht-Whitespace---' "/>
  <xsl:value-of select="replace(replace($input,'-+','-'),'^-|-$','')"/>
</xsl:template>

In diesem Code wird replace() zweimal aufgerufen. Der innere Aufruf ersetzt mehrere Vorkommen von - durch ein einziges -, und der äußere Aufruf entfernt führende und abschließende --Zeichen.

  

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