Tim Tepaße: XSLT / XPath / my:translate()

Beitrag lesen

Hallo zusammen,

Mit XSLT 2.0 ist es auch nicht so einfach. Falls du mit replace() nicht klar kommst.

Ich versuch's mal. Disclaimer: Ich hab keine Ahnung von XSLT 2 und probiert einfach nur mal meine Lösungsvorstellung mit bestehenden Elementen zu realisieren:

<?xml version="1.0"?>  
<xsl:stylesheet version="2.0"  
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
                xmlns="tag:tepasse.org,2007-06-19:xslt/root"  
                xmlns:my="tag:tepasse.org,2007-06-19:xslt/my"  
                xmlns:xs="http://www.w3.org/2001/XMLSchema"  
                exclude-result-prefixes="#all">  
  
    <xsl:output encoding="UTF-8"  
                indent="yes"  
                undeclare-prefixes="yes"  
                method="xml" />  
  
    <xsl:param name="text">  
        Diés ist ein Töxt mit Ümläuten und scharfem Eß. Öder ätwa nücht?  
    </xsl:param>  
  
    <xsl:function name="my:translate">  
        <xsl:param name="text" as="xs:string"/>  
        <xsl:param name="mappings" as="xs:string"/>  
        <xsl:param name="alternates" as="xs:string"/>  
  
        <xsl:variable name="prestrings"  
                      select="tokenize($mappings, '\s+')"/>  
        <xsl:variable name="poststrings"  
                      select="tokenize($alternates, '\s+')"/>  
  
        <xsl:variable name="length"  
                      select="min((count($prestrings),  
                                   count($poststrings)))"/>  
  
        <xsl:variable name="newtext"  
                      select="  
            if ($length > 1)  
            then  
                my:translate($text,  
                             string-join($prestrings[position() = (2 to $length)], ' '),  
                             string-join($poststrings[position() = (2 to $length)], ' '))  
            else  
                $text"/>  
  
        <xsl:sequence select="replace($newtext,  
                                      $prestrings[1],  
                                      $poststrings[1])"/>  
    </xsl:function>  
  
    <xsl:template match="/">  
    <test>  
    <xsl:value-of select="my:translate($text,  
                                       'ä  ö  ü  Ä  Ö  Ü  ß  é',  
                                       'ae oe ue Ae Oe Ue ss e')"/>  
    </test>  
    </xsl:template>  
  
</xsl:stylesheet>

Funktioniert in Saxon. Etwas umständlich, ja, insbesondere das Tokenisieren und Zusammenfriemeln, aber mir macht es mehr Spaß als Deine Lösung, Thomas. ;)

(Und ausserdem war ich vorhin nur hier gelandet um kundzutun, dass man sicherlicher im Notfall eine sehr quicke und sehr dirrrrty Lösung mit xsl:character-map/ machen könnte, vorausgesetzt das Ziel-Markup käme einem nicht in die Quere. Aber nicht sehr empfehlenswert.)

Tim