Hevelmann: Probleme mit Anführungszeichen in Attributen

Hallo Leute,

ich habe folgendes Problem:

ich möchte mittels xsl diesen Ausdruck:

<item name="Title">
     <text>Text in "Anführungszeichen"</text>
</item>

in diesen umwandeln

<SEGMENT name="Segmentname" type="xyz" value="Text in "Anführungszeichen"/>

Ich verwende folgenden Stylesheet:

<SEGMENT name="Segmentname" type="xyz">
    <xsl:attribute name="value">
           <xsl:value-of select="." />
    </xsl:attribute>
</SEGMENT>

Allerdings sieht mein Output folgendermaßen aus:

<SEGMENT name="Segmentname" type="xyz" value="Text in "Anführungszeichen"/>

Das ist aber falsch,da es zu einem Fehler führt richtig müsste sein:

<SEGMENT name="Segmentname" type="xyz" value="Text in "Anführungszeichen"/>

Hat jemand eine Ahnung wie ich dieses Problem lösen kann ??

Ich bin für jede Hilfe dankbar

Gruss Hevelmann

  1. Oh da ist mir ein kleiner Fehler unterlaufen, da hab ich doch glatt ein paar Anführungszeichen vergessen. Also hier nochmal neu:

    Hallo Leute,

    ich habe folgendes Problem:

    ich möchte mittels xsl diesen Ausdruck:

    <item name="Title">
         <text>Text in "Anführungszeichen"</text>
    </item>

    in diesen umwandeln

    <SEGMENT name="Segmentname" type="xyz" value="Text in "Anführungszeichen""/>

    Ich verwende folgenden Stylesheet:

    <SEGMENT name="Segmentname" type="xyz">
        <xsl:attribute name="value">
               <xsl:value-of select="." />
        </xsl:attribute>
    </SEGMENT>

    Allerdings sieht mein Output folgendermaßen aus:

    <SEGMENT name="Segmentname" type="xyz" value="Text in "Anführungszeichen""/>

    Das ist aber falsch,da es zu einem Fehler führt richtig müsste sein:

    <SEGMENT name="Segmentname" type="xyz" value="Text in "Anführungszeichen""/>

    Hat jemand eine Ahnung wie ich dieses Problem lösen kann ??

    Ich bin für jede Hilfe dankbar

    Gruss Hevelmann

    1. Hallo Hevelmann,

      mich wundert erstmal warum Du nicht statt " ein normales Apostroph nimmst => '
      Damit sollte es problemlos klappen.

      Weihnachtlichen Gruß
      -Marco Wagner-

      1. Hallo Marco,

        danke für die schnelle Antwort.

        Der Text in "Anführungszeichen" ist ja vorgegeben und ich möchte ihn vom Textknoten in das Attribut als Value einfügen. Mein Problem ist also, dass ich den Text bereits mit "Anführungszeichen" bekomme und leider nicht in 'Apostrophen'.

        Gruss Hevelmann

        1. XSLT hat glücklicherweise eine Funktion die es erlaubt beliebige Character sofort umzuwandeln.

          z.B.
          <xsl:value-of select="translate(current(),'a','A')"/>

          Dabei wir das kleine a durch das grosse A ersetzt. Dort wo current() steht kann ein beliebiger String stehen.

          für Deinen Fall hoffe ich das geht:

          translate(current(),' " ',' ' ')

          Glaube mir Backslash konnte man den Abschluß-Apostroph nicht mit dem mittigen verwechseln.
          oder probier:
          translate(current(),' " '," ' ")

          Gruß
          -Marco Wagner-

          1. Hallo Marco & Franz,

            danke vielmals für Eure Tipps. Allerdings haben sie leider nicht zum gewünschten Erfolg geführt.

            von Franz:
            <xsl:value-of select="." disable-output-escaping="no" />

            leider immer noch das gleiche Ergebnis wie vorher:

            <SEGMENT name="Segmentname" type="sf" value="vbw fordert "Bildungsreform""/>

            von Marco:

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

            bringt jedesmal den Fehler:
            "This file is not well-formed: Name ((Letter |'_'| ':') (Name-Character)*) expected.

            Ganz schön verzwickte Kiste oder ??

            1. Hallo Hevelmann

              von Franz:
              <xsl:value-of select="." disable-output-escaping="no" />

              Hm, mit Saxon und IE geht's. Aber translate() ist sicherer, da es jeder XSLT-Prozessor unterstützen muss.

              von Marco:

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

              bringt jedesmal den Fehler:
              "This file is not well-formed: Name ((Letter |'_'| ':') (Name-Character)*) expected.

              Siehe dazu mein Posting zu Marco. Mit Saxon und IE getestet.

              Ganz schön verzwickte Kiste oder ??

              Ohne Zweifel ;-)

              Gruß
              Franz

          2. Hallo Marco,

            für Deinen Fall hoffe ich das geht:

            translate(current(),' " ',' ' ')

            Glaube mir Backslash konnte man den Abschluß-Apostroph nicht mit dem mittigen verwechseln.

            Nee, so geht's leider nicht. Der Backslash ist in XML kein Escape-Zeichen

            oder probier:
            translate(current(),' " '," ' ")

            Das geht ebenfalls nicht, da die translate-Funktion ja innerhalb eines Attribut-Werts steht. Dort sind unmaskierte Anführungszeichen nicht zugelassen

            So geht's:

            translate(text,'"',"'")

            Gruß
            Franz

            1. Es hat geklappt !!! :-)

              Danke Franz und danke auch Marco Ihr hab mir sehr weitergeholfen.

              Gruss Hevelmann

            2. So geht's:

              translate(text,'"',"'")

              Gruß
              Franz

              Das was Franz jetzt zuletzt vorgeschlagen hat müsste aber klappen.
              Ist ne Kombination aus beiden Ideen -grins- :-)

              Das " wird allerdings wieder dein Anführungszeichen " erstellen, also würde ich es durch das Escapezeichen für das einfache Apostroph ' ersetzen. Fällt mir grad nicht ein welches das war.

              Gruß
              -Marco Wagner-

        2. Hallo Marco,

          <xsl:value-of select="." disable-output-escaping="no" />

          sollte Dir helfen

          Gruß
          Franz