snow_white: XSLT / XPath translate() / $apos

Hallo,
ich möchte gern das Apostroph ($apos) mit der XPath-Funktion translate() in einen Unterstrich umwandeln.
In einem Forum im Internet habe ich einen Eintrag hierzu von Michael Kay gelesen:
URL: http://www.stylusstudio.com/xsllist/200701/post90250.html

XML:
<buch TEXT="Hermine's book" />

XSLT:
...
<xsl:template match="book">
<xsl:variable name="apos">'</xsl:variable>
<xsl:value-of select="translate(@TEXT, $apos, '_')"/>
</xsl:template>
...

Output:
Hermine' book

Komischerweise wird das Apostroph nicht in einen Unterstrich umgewandelt. Dafür wird der Buchstabe danach gelöscht.
Die anderen Möglichkeiten um ein Apostroph auszuzeichen, die ich im Internet gefunden habe, funktionieren alle leider nicht:
<xsl:value-of select="translate(@TEXT, &quot;$apos;$quot;, '_')"/>
<xsl:value-of select="translate(@TEXT, &quot;'$quot;, '_')"/>

Ich benutze für die Transformation übrigens die Standard-Engine vom AltovaXMLSpy.

Vielen Dank im voraus für Eure Hilfe.
Viele Grüße
snow_white

  1. Output:
    Hermine' book

    Komischerweise wird das Apostroph nicht in einen Unterstrich umgewandelt. Dafür wird der Buchstabe danach gelöscht.
    Die anderen Möglichkeiten um ein Apostroph auszuzeichen, die ich im Internet gefunden habe, funktionieren alle leider nicht:
    <xsl:value-of select="translate(@TEXT, &quot;$apos;$quot;, '_')"/>
    <xsl:value-of select="translate(@TEXT, &quot;'$quot;, '_')"/>

    Ich benutze für die Transformation übrigens die Standard-Engine vom AltovaXMLSpy.

    Schon mal einfach translate( //@text, "'", "_") versucht? Ich kanns gerade nicht mit Altova testen, aber das sollte schon hinhauen.

    Gruß Ben

    1. Oder das ' escapen.
      translate( //@text, '&#39;', '_')

      Gruß Ben

      1. Hallo Ben,
        vielen Dank für Deine Mithilfe.

        translate( //@text, '&#39;', '_')

        Leider funktioniert das nicht.
        Ich erhalte foldende Fehlermeldung:
        Ungültiger XPath 2.0-Ausdruck
        Unerwartetes Token -"_'

        Viele Grüße
        snow_white

    2. Hallo,

      Schon mal einfach translate( //@text, "'", "_") versucht? Ich kanns gerade nicht mit Altova testen, aber das sollte schon hinhauen.

      Das wird nicht funktionieren.
      select="translate( //@text, " --> alles ab hier wirft einen Fehler, weil das Attribut für den Prozessor beendet ist.

      Grüße
      Thomas

      1. Das wird nicht funktionieren.
        select="translate( //@text, " --> alles ab hier wirft einen Fehler, weil das Attribut für den Prozessor beendet ist.

        Grüße
        Thomas

        Jo, der Codeschnipsel war Schmarrn.

        Gruß Ben

  2. Hallo,

    ich möchte gern das Apostroph ($apos) mit der XPath-Funktion translate() in einen Unterstrich umwandeln.
    In einem Forum im Internet habe ich einen Eintrag hierzu von Michael Kay gelesen:
    URL: http://www.stylusstudio.com/xsllist/200701/post90250.html

    Komischerweise wird das Apostroph nicht in einen Unterstrich umgewandelt. Dafür wird der Buchstabe danach gelöscht.

    Ich benutze für die Transformation übrigens die Standard-Engine vom AltovaXMLSpy.

    <data>
     Hermine's Buch
    </data>
    --------
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
     <xsl:template match="/data">
      <xsl:variable name="apos">'</xsl:variable>
      <xsl:value-of select="translate(., $apos, '_')" />
     </xsl:template>
    </xsl:stylesheet>
    ------
     Hermine_s Buch

    Gestest mit
    AltovaXML Version 2007 rel. 3
    build: May 31 2007

    und mit Saxon8b

    Grüße
    Thomas

    1. Hallo Thomas,
      vielen Dank für Deine schnelle Antwort.
      Dein Beispiel funktioniert bei mir auch.

      <data>
      Hermine's Buch
      </data>

      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
      <xsl:template match="/data">
        <xsl:variable name="apos">'</xsl:variable>
        <xsl:value-of select="translate(., $apos, '_')" />
      </xsl:template>
      </xsl:stylesheet>

      Hermine_s Buch

      Bei mir ist das Apostroph aber leider in einem Attribut und damit geht es leider nicht. :-/

      Viele Grüße
      snow_white

      1. Dann verknüpf doch einfach die ganzen Antworten?

          
        <xsl:template match="book">  
           <xsl:variable name="apo">'</xsl:variable>  
           <xsl:value-of select="translate(//@text, $apo, '_')"/>  
        </xsl:template>  
        
        

        Sollte genauso gehen:

          
        <xsl:template match="book">  
           <xsl:variable name="apo">'</xsl:variable>  
           <xsl:value-of select="translate(.@text, $apo, '_')"/>  
        </xsl:template>  
        
        

        Gruß Ben

      2. Hallo,

        vielen Dank für Deine schnelle Antwort.
        Dein Beispiel funktioniert bei mir auch.

        <data>
        Hermine's Buch
        </data>

        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
        <xsl:template match="/data">
          <xsl:variable name="apos">'</xsl:variable>
          <xsl:value-of select="translate(., $apos, '_')" />
        </xsl:template>
        </xsl:stylesheet>

        Hermine_s Buch

        Bei mir ist das Apostroph aber leider in einem Attribut und damit geht es leider nicht. :-/

        Das kann ich nicht nachvollziehen (Testdaten so geändert):

        <data title="Hermine's Buch" />

        <xsl:value-of select="translate(@title, $apos, '_')" />

        Die ausgabe ist noch immer dieselbe.

        In welchem Kontext versucht du das Attribute auszulesen?

        Grüße
        Thomas

        1. Hallo Thomas,

          Das kann ich nicht nachvollziehen (Testdaten so geändert):

          <data title="Hermine's Buch" />

          <xsl:value-of select="translate(@title, $apos, '_')" />

          Die ausgabe ist noch immer dieselbe.

          In welchem Kontext versucht du das Attribute auszulesen?

          Ich möchte halt nicht nur das Apostraph in meinem Fall umwandeln, sondern gleichzeitig auch noch ein paar andere Zeichen.
          Wenn ich es so umsetze, wie hier:
          ...
          <xsl:attribute name="href">
          <xsl:variable name="apos">'</xsl:variable>
          <xsl:value-of select="translate(@TEXT, '?!- $apos', '_____')" />
          </xsl:attribute>
          ...

          dann wird das Apostroph nicht umgewandelt und der Buchstabe nach dem Apostroph und der zweite vor dem Apostroph werden gelöscht.

          Viele Grüße
          snow_white

          Viele Grüße
          snow_white

          1. Hallo,

            <xsl:attribute name="href">
            <xsl:variable name="apos">'</xsl:variable>
            <xsl:value-of select="translate(@TEXT, '?!- $apos', '_____')" />
            </xsl:attribute>
            ...

            dann wird das Apostroph nicht umgewandelt

            Klar, weil du das innerhalb vom ' ' hast, also wird dan $, a, p, o, s gesucht.

            <data title="Her?mi-ne's Bu!ch" />
            <xsl:value-of select="translate(@title, concat('?!- ', $apos), '_____')" />

            Ausgabe: Her_mi_ne_s_Bu_ch

            Grüße
            Thomas

            1. Hallo Thomas,
              super!:o)

              <data title="Her?mi-ne's Bu!ch" />
              <xsl:value-of select="translate(@title, concat('?!- ', $apos), '_____')" />

              Ausgabe: Her_mi_ne_s_Bu_ch

              So funktioniert es.
              Vielen vielen Dank.
              Viele Grüße
              snow_white

      3. Hallo Thomas,
        ich habe es jetzt noch ein paar Mal getestet und in meiner Beispieldatei funktioniert das Ersetzen des Apostrophs durch einen Unterstrich jetzt doch, obwohl ich ein Attribut verwende.
        Leider funktioniert es aber nicht korrekt in meiner Hauptdatei.
        Viele Grüße
        snow_white