Announcement

Collapse
No announcement yet.

translate / replace

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • translate / replace

    Hallo mitenand

    die Aufgabe ist die folgende:

    in einem gewöhnlichen Text (z.B. News aus Politik, Wirtschaft usw.) müssen die Anführungszeichen (Gänsefüsschen '"' zu entweder '«' oder '»') gewechselt werden.

    Beispiel: "Siemens" zu «Siemens»

    dazu braucht es eine dreiteilige 'translate'-Routine:
    1. (Space") wechseln zu (Space«)
    2. (Bindestrich") wechseln zu (Bindestrich«)
    und
    3. alle restlichen (") wechseln zu (»)

    mit der folgenden Routine ist ein Replacment möglich, ABER wie alle drei?


    <xsl:call-template name="globalReplace">
    <xsl:with-param name="string" select="normalize-space(.)"/>
    <xsl:with-param name="old" select="' &#x22;'"/>
    <xsl:with-param name="new" select="' «'"/>
    </xsl:call-template>

    <xsl:template name="globalReplace">
    <xslaram name="string"/>
    <xslaram name="old"/>
    <xslaram name="new"/>
    <xsl:choose>
    <xsl:when test="contains($string,$old)">
    <xsl:value-of select="concat(substring-before($string,$old),$new)"/>
    <xsl:call-template name="globalReplace">
    <xsl:with-param name="string" select="substring-after($string,$old)"/>
    <xsl:with-param name="old" select="$old"/>
    <xsl:with-param name="new" select="$new"/>
    </xsl:call-template>
    </xsl:when>
    <xsltherwise>
    <xsl:value-of select="$string"/>
    </xsltherwise>
    </xsl:choose>
    </xsl:template>

    vielen Dank, wenn jemand helfen kann.

  • #2
    Du kannst an der Ausgabestelle von $string ein weiteres xsl:call-template mit der nächsten Ersetzung schalten. Das erscheint mir allerdings unnötig kompliziert und zudem gibt es vermutlich auch Anführungszeichen mit folgendem Komma oder Satzpunkt oder Zitate stehen vielleicht auch direkt am Satzanfang. Es sollte reichen, alle "-Zeichen durchzugehen und nach ungerader/gerader Position eben die gesuchten Ersatzzeichen auszugeben. Dieser Testansatz arbeitet so:
    Code:
    <xsl:template match="test">
      <xsl:call-template name="replace_quotes">
        <xsl:with-param name="pos" select="1"/>
        <xsl:with-param name="str" select="."/>
        <xsl:with-param name="str_temp" select="''"/>
      </xsl:call-template>
    </xsl:template>
    
    <xsl:template name="replace_quotes">
      <xsl:param name="pos" select="$pos"/>
      <xsl:param name="str" select="$str"/>
      <xsl:param name="str_temp" select="$str_temp"/>
    
      <xsl:choose>
        <xsl:when test="contains($str,'&quot;')">
          <xsl:variable name="str_before" select="substring-before($str,'&quot;')"/>
          <xsl:variable name="str_after" select="substring-after($str,'&quot;')"/>
    
          <xsl:call-template name="replace_quotes">
            <xsl:with-param name="pos" select="$pos + 1"/>
            <xsl:with-param name="str" select="$str_after"/>
            <xsl:with-param name="str_temp">
              <xsl:choose>
                <xsl:when test="$pos mod 2 = 1">
                  <xsl:value-of select="concat($str_temp,$str_before,'«')"/>
                </xsl:when>
                <xsl:otherwise>
                  <xsl:value-of select="concat($str_temp,$str_before,'»')"/>
                </xsl:otherwise>
              </xsl:choose>            
            </xsl:with-param>
          </xsl:call-template>
        </xsl:when>
    
        <xsl:otherwise>
          <xsl:value-of select="concat($str_temp,$str)"/>
        </xsl:otherwise>
      </xsl:choose>
    
    </xsl:template>
    Zum Testen wurde dieses XML-Dokument verwendet:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <test>Test mit "Zitat" im String und noch einem "etwas längeren Zitat" danach.</test>
    Ergebnis:
    Test mit «Zitat» im String und noch einem «etwas längeren Zitat» danach.

    BTW: Falls XSLT/XPath 2.0 zur Verfügung steht, gibt es einfachere Ansätze mit den Funktionen fn:replace() oder fn:tokenize().
    Zuletzt editiert von Thomas Meinike; 26.03.2009, 14:32.

    Comment

    Working...
    X