Thomas J.S.: XSLT / XPath / translate()

Beitrag lesen

Hallo,

danke noch einmal. Leider funktioniert das doch nicht so richtig.

<xsl:value-of select="concat(translate(@TEXT, 'Ö', 'O'), 'E')"/>

Es wird zwar Ö durch O im String ersetzt, allerdings wird das E einfach hinten an das Wort drangehängt und nicht hinter das O direkt.
Also:
Öl wird zu Ole.

Aber vielleicht bringt mich die Funktion replace() weiter.

Also für XSLT 1.0 ist es echt ein Problem, da kann man so etwas nur mit einer zweifachen Rekursion lösen:
-------------------------
<xsl:template name="replace">
  <xsl:param name="text"/>
  <xsl:param name="searchstring"/>
  <xsl:param name="replacestring"/>
  <xsl:variable name="textbefore" select="substring-before($text, $searchstring)"/>
  <xsl:variable name="textafter" select="substring-after($text, $searchstring)"/>
  xsl:choose
   <xsl:when test="contains($text, $searchstring)">
    <xsl:call-template name="replace">
     <xsl:with-param name="searchstring" select="$searchstring"/>
     <xsl:with-param name="replacestring" select="$replacestring"/>
     <xsl:with-param name="text" select="concat($textbefore, $replacestring, $textafter)"/>
    </xsl:call-template>
   </xsl:when>
   xsl:otherwise
    <xsl:value-of select="$text"/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
-------------------------
Dies würde schon mal alle _gleichen_ Zeichen ersetzen
searchstring = ö
replacestring = oe

Jetzt müsstest du aber dieses Template wieder für jedes andere Zeichen aufrufen: d.h. du müsstest nochmal ein Template schreiben, dass mit
wehen test="constains($text, 'Ö') or constains($text, 'ä') ...." sich selbst aufruft und bei jedem Aufruf das "replace"-Template aufruft.

Mit XSLT 2.0 ist es auch nicht so einfach. Falls du mit replace() nicht klar kommst. (bin ich bei den Umlauten auch nicht und es war schneller was anderes zu schreiben als ewig zu Experimentieren)

Das " | " ist hier der Trenner zwischen den zu ersetzenden Zeichen.
Die Zahl der Zeichen im zeichen1 kann höher sein als im zeichen2, dann werden die Zeichen für die es keine Übereinstimmung gibt duch "nichts" ersetzt (sprich gelöscht).
---------------------
 <xsl:template name="sonderzeichen">
  <xsl:param name="text"/>
  <xsl:param name="counter" select="0" />
  <xsl:variable name="zeichen1">ä|Ä|ö|Ö|ü|Ü|ß|é</xsl:variable>
  <xsl:variable name="zeichen2">ae|Ae|oe|Oe|ue|Ue|ss|e</xsl:variable>
  <xsl:variable name="t1" select="tokenize($zeichen1, '|')"/>
  <xsl:variable name="t2" select="tokenize($zeichen2, '|')"/>
  xsl:choose
   <xsl:when test="$counter &lt; count($t1)">
    xsl:choose
     <xsl:when test="contains($text, $t1[$counter+1])">
      <xsl:variable name="replacetext">
       <xsl:call-template name="replace">
        <xsl:with-param name="searchstring" select="$t1[$counter+1]" />
        <xsl:with-param name="replacestring" select="$t2[$counter+1]" />
        <xsl:with-param name="text" select="$text" />
       </xsl:call-template>
      </xsl:variable>
      <xsl:call-template name="sonderzeichen">
       <xsl:with-param name="text" select="$replacetext" />
       <xsl:with-param name="counter" select="$counter+1"></xsl:with-param>
      </xsl:call-template>
     </xsl:when>
     xsl:otherwise
      <xsl:call-template name="sonderzeichen">
       <xsl:with-param name="text" select="$text" />
       <xsl:with-param name="counter" select="$counter+1"></xsl:with-param>
      </xsl:call-template>
     </xsl:otherwise>
    </xsl:choose>
   </xsl:when>
   xsl:otherwise
    <xsl:sequence select="$text" />
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
<xsl:template name="replace">
  <xsl:param name="text"/>
  <xsl:param name="searchstring" />
  <xsl:param name="replacestring" />
  <xsl:variable name="textbefore" select="substring-before($text, $searchstring)" />
  <xsl:variable name="textafter" select="substring-after($text, $searchstring)" />
  xsl:choose
   <xsl:when test="contains($text, $searchstring)">
    <xsl:call-template name="replace">
     <xsl:with-param name="searchstring" select="$searchstring" />
     <xsl:with-param name="replacestring" select="$replacestring" />
     <xsl:with-param name="text" select="concat($textbefore, $replacestring, $textafter)" />
    </xsl:call-template>
   </xsl:when>
   xsl:otherwise
    <xsl:sequence select="$text" />
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
---------------------------

Aufruf:
<xsl:call-template name="sonderzeichen">
     <xsl:with-param name="text" select="  Knoten  " />
    </xsl:call-template>

Grüße
Thomas