fn:translate

(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 – Manipulation

Herkunft: XPath 1.0

Rückgabewert: Ein String xs:string; der Eingabestring mit vorgenommenen Zeichenersetzungen.

Aufruf/Argumente:

fn:translate($eingabe, '$ersetztezeichen', '$ersatzzeichen')

$eingabe:
Obligatorisch. Erstes Argument ist ein Eingabestring xs:string, in dem ein Zeichenaustausch vorgenommen werden soll. Handelt es sich bei dem Argument nicht um einen String, so wird ein Typfehler gemeldet. Die leere Sequenz ist als Wert zugelassen und wird wie der leere String behandelt.

$ersetztezeichen:
Obligatorisch. Zweites Argument ist ein String xs:string, der als Liste zu ersetzender Zeichen interpretiert wird. Wird ein Stringliteral übergeben, so muss es von Stringbegrenzern umgeben sein.

$ersatzzeichen:
Obligatorisch. Drittes Argument ist der String xs:string, der als Liste der Ersetzungszeichen interpretiert wird. Dieser String korrespon­diert Zeichen für Zeichen mit dem String des zweiten Arguments, also den zu ersetzenden Zeichen, darf aber auch kürzer als jener sein. Wird ein Stringliteral übergeben, so muss es von Stringbegrenzern umgeben sein.

Verwendungszweck:

Die Funktion fn:translate() kann beliebige Zeichen innerhalb eines übergebenen String durch beliebige andere Zeichen ersetzen. Auch das Leerzeichen und die anderen Whitespacezeichen gelten in diesem Zusammenhang als normale Zeichen.

Wird im Ursprungsstring ein Zeichen aus dem String zu ersetzender Zeichen (mapString) gefunden, so wird es durch sein korrespondierendes Zeichen im String der Ersetzungszeichen (transString) ersetzt. Steht also das gefundene Zei­chen an dritter Position im String der auszuwechselnden Zeichen, so wird es entsprechend durch das dritte Zeichen aus dem Ersetzungszeichenstring ersetzt.

Tritt ein Zeichen im String der zu ersetzenden Zeichen mehrmals auf, so wird es durch das Zeichen ersetzt, das zu seinem ersten Auftreten korrespondiert:

fn:translate($text,'aaa','zyx')

ersetzt 'a' immer durch 'z' (nicht etwa die Folge 'aaa' durch 'zyx' – dies ließe sich durch fn:replace() realisieren).

Ist der Ersetzungszeichenstring (transString) kürzer als der String der zu erset­zenden Zeichen (mapString), so werden alle diejenigen Zeichen aus dem Ursprungsstring entfernt, für die sich im Ersetzungszeichenstring kein korres­pondierendes Zeichen findet. Im umgekehrten Fall werden die überschüssigen Zeichen im Ersetzungszeichenstring ignoriert.

Soll der String der Ersetzungszeichen leer sein (sollen also alle, als zweites Argument, übergebene Zeichen entfernt werden), so muss das dritte Argument dennoch in Form der leeren Stringbegrenzer vorhanden sein. Der Eingabestring wird entsprechend verkürzt.

Wird für das erste Argument die leere Sequenz übergeben, so gibt die Funktion den leeren String zurück.

Beispiele:

Beispiel 1 – Bestimmte Buchstaben ersetzen:

fn:translate('Das ist ein Beispiel!', 'ae', 'AE'
  )
 

ergibt "DAs ist Ein BEispiEl!"

Beispiel 2 – Alle Kleinbuchstaben durch Großbuchstaben ersetzen:

Um in einem Eingabestring $x alle Kleinbuchstaben durch Großbuchstaben zu ersetzen, kann man die Funktion fn:translate() folgendermaßen anwen­den:

fn:translate($x, 
               'abcdefghijklmnopqrstuvwxyz', 
               'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  )

Für $x gleich 'Das ist ein Beispiel!' ergibt sich 'DAS IST EIN BEI­SPIEL!'.

Beispiel 3 – Überprüfung auf Folge beliebiger Ziffern:

Um einen String auf das Auftreten von Gruppen aus je vier beliebiger Ziffern zu überprüfen, kann man eine Kombination der Funktionen fn:translate() und fn:contains() verwenden.

<xsl:if 
 test="fn:contains( 
             fn:translate($ziffern, 
                        '123456789', 
                        '000000000'
               ), '0000'
          )">
   <!-- Templateblock -->
</xsl:if>

Jede beliebige Ziffernfolge wird in eine Folge von vier Nullen übersetzt, deren Vorhandensein einfach mit fn:contains() geprüft wird. Die 0 muss dafür nicht eigens ausgetauscht werden.

Beispiel 4 – Entfernen bestimmter Zeichen:

Das Entfernen von Zeichen kann nützlich sein, falls man Leerzeichen, Binde­striche, Slashes o. Ä. aus Telefonnummern entfernen möchte:

fn:translate($telefon, 
              '&#x20;&#x9;&#xA;&#xD;(/)-', 
              ''
  )

Die zu löschenden Whitespacezeichen sind hier als Character Entities in die Liste der zu ersetzenden Zeichen eingefügt. Zu beachten ist, dass auch eine Ersatzzeichenliste in Form eines leeren Strings vorhanden sein muss.

Für die Eingabe (012) 345-67-89 ergibt sich damit 0122345678

Beispiel 5 – Einfache Kryptographie:

Durch 1:1-Übersetzung des gesamten Alphabets lässt sich eine sehr simple Kryptographie erreichen:

fn:translate('das ist ein beispiel!', 
              'abcdefghijklmnopqrstuvwxyz',
              'zyxwvutsrqponmlkjihgfedcba'
  )

ergibt 'wzh rhg vrm yvrhkrvo!'

Die Umwandlung ist zur »Entschlüsselung« auch in umgekehrter Richtung möglich. Die Methode ist aber leicht zu erkennen und bietet daher keinerlei wirkliche Sicher­heit.

Funktionsdefinition:

XPath 1.0:

translate(string, string, string)=> string

XPath 2.0:

fn:translate($arg as xs:string?,
             $mapString as xs:string,
             $transString 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