Gern stehe ich zur fachlichen Unterstützung in XML-Technologien, C#.NET, VisualBasic.NET und Java zur Verfügung. Sprechen Sie mich einfach an: Mail oder ☎ 0151 . 750 360 61


XPath 3.0, XPath 2.0, XPath 1.0 / XPath-Funktionen / Stringfunktionen / XPath: translate

XPath: translate

XPath: translate

➪ Die XPath-Funktion translate erlaubt, jedes Zeichen eines Strings gezielt durch ein anderes Zeichen zu ersetzen.

Auf dieser Seite:

Bei einfachster Verwendung der translate-Funktion wird jedes Zeichen, das bei einer Zeichenkette (erster Parameter) in einer zweiten Parameterliste steht, durch ein anderes Zeichen ersetzt, das in einer dritten Parameterliste an derselben Stelle steht.

Beispiel: Die folgende Logik arbeitet eine Itemliste aus einem XML-Input-Dokument ab. Nehmen Sie an, einer der dort angesprochenen Namen sei "Sagblos". Durch Verwendung der translate-Funktion wird aus 'Sagblos' dann 'Sxgylos'.


<xsl:for-each select="/Orte/Ort[1]/Mensch/name">
  <xsl:value-of select="translate(., 'abc', 'xyz')" />  	
</xsl:for-each>

Eine Variante ist, eine leere Zeichenkette als dritten Parameter zu übergeben. Dann werden alle Zeichen in dem zweiten Parameter gelöscht. Beispiel: Aus 'Sagblos' wird dann 'Sglos'.


<xsl:value-of select="translate(name, 'abc', '')" />

Alle Nicht-Zahlen löschen

Das können Sie sich für weitergehende Zwecke zunutze machen. Nehmen Sie an, Sie hätten eine Zeichenkette 'ers1dhsfkh2lk3dg4+,5jklsd6sdlgk7lvg8dgs9hg?', in der auch weitere beliebige Zeichen enthalten sein können, und wollten daraus die Zahlen ermitteln; das Resultat würde in diesem Fall also lauten '123456789'.

Mit einem doppelten Einsatz der translate-Funktion wird zunächst eine Hilfsvariable mit dem Inhalt 'ersdhsfkhlkdg+,jklsdsdlgklvgdgshg?' generiert, die sämtliche Zeichen enthält, die nicht benötigt werden.

Anschliessend wird in einem zweiten translate-Aufruf die ursprüngliche Zeichenkette übergeben, darin die nicht benötigten Zeichen, und als dritter Parameter eine leere Zeichenkette. Übrig bleibt '123456789'.


<xsl:variable name="vstr">
      ers1dhsfkh2lk3dg4+,5jklsd6sdlgk7lvg8dgs9hg?
</xsl:variable>
<xsl:variable name="vstr2">
  <xsl:value-of 
       select="translate($vstr, '0123456789', '')" />
</xsl:variable>
<xsl:value-of 
     select="translate($vstr, $vstr2, '')" />

Alternative: replace

In Java steht für derlei Zwecke die replaceAll-Methode der String-Klasse zur Verfügung.


String s = "ers1dhsfkh2lk3dg4+,5jklsd6sdlgk7lvg8dgs9hg?";
s = s.replaceAll("[^0-9]", "");
System.out.println(s);

Den hier verwendeten können Sie auch in der -Funktion verwenden, die ab XSL 2.0 zur Verfügung steht.


<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:variable name="vstr">
        ers1dhsfkh2lk3dg4+,5jklsd6sdlgk7lvg8dgs9hg?
    </xsl:variable>
    <xsl:template match="/">
        <erg>
            <xsl:value-of 
                 select="replace($vstr, '[^0-9]', '')"/>
        </erg>
    </xsl:template>
</xsl:stylesheet>

In XQuery liest sich das so:


<erg>{
let $str as xs:string 
    := "ers1dhsfkh2lk3dg4+,5jklsd6sdlgk7lvg8dgs9hg?"
return replace($str, "[^0-9]", "")
}</erg>

wg / 15. November 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/translate.html