Frank: XSL, JavaScript, Sonderzeichen (Anführungszeichen)

Hallo Zusammen,

ich habe hier ein kleinen Problem mit XSL, JavaScript und Sonderzeichen (Anführungszeichen).

Im XML habe ich ein Tag, der folgenden Inhalt haben kann:

<item>Ein "Forum" ist eine 'tolle' Sache</item>

...es kann also einfache und doppelte Anführungszeichen enthalten.

Nun will ich mittels XSL eine HTML-Datei erzeugen, die auch JavaScript enthält. In dem JavaScript soll ein String zusammengebaut werden, der den Inhalt des item-Tags enthält, vereinfacht etwa so:

<xsl:stylesheet...

<script language="JavaScript" type="text/javascript">
<xsl:text disable-output-escaping="yes">
<![CDATA[
...
s = "]]></xsl:text><xsl:value-of select="item" /><xsl:text disable-output-escaping="yes"><![CDATA[";
...
 ]]>
</xsl:text>
</script>

</xsl:stylesheet>

(Die eigentlichen JavaScript-Fragmente im XSL sind CDATA-geschützt.)

Nun gibt es aber Probleme wegen den Anführungszeichen, da das JavaScript im erzeugten HTML etwa so aussieht

s = "Ein "Forum" ist eine 'tolle' Sache";

Die Anzührungszeichen müssten irgendwie mit einem \ maskiert werden, aber wie kann ich das in diesem Fall machen?
So wie ich das sehe, funktioniert eine replace-Funktion im JavaScript ja auch nicht, es müsste also irgendwie mit XSL gehen, bloß wie? Ich sitz da jetzt schon ewig dran, bekomme es aber nicht hin! oder steh ich da irgendwie auf dem Schlauch?

Wäre klasse, wenn da jemand was wüsste!

danke schon mal!

mfg
Frank

  1. Hi,

    Die Anzührungszeichen müssten irgendwie mit einem \ maskiert werden, aber wie kann ich das in diesem Fall machen?

    die XSL-String-Funktionen sind nicht wirklich prickelnd, aber sie existieren. Du kannst mit ihnen z.B. eine Rekursion aufbauen, die diesen Fall behandelt, bzw. allgemein Ersetzungen.

    Ich sitz da jetzt schon ewig dran, bekomme es aber nicht hin! oder steh ich da irgendwie auf dem Schlauch?

    XSL ist weit davon entfernt, eine Hochsprache zu sein. Es scheiden sich bereits die Geister bei der Frage, ob es sich überhaupt um eine Programmiersprache handelt. Ich kann Dir sagen, dass es möglich ist - aber mühevoll. Nicht aufgeben. Versuche, XSL zu denken.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo,

    Die Anzührungszeichen müssten irgendwie mit einem \ maskiert werden, aber wie kann ich das in diesem Fall machen?

    Du sollst dir die Funktionen contains(), substring-before() und substring-after() im Selfhtml ansehen.
    Du kannst den Text von <item> dann mit einem rekursiven Template durchsuchen und zerlegen.
    Für solche Templates (die im Text suchen und ersetzen bzw. hinzufügen) findest du viele Beispiel im Archiv. Diese kannst du mit nur ganz wenig Mühe für dich anpassen.

    Grüße
    Thomas

    1. Hallo,

      Du sollst dir die Funktionen contains(), substring-before() und substring-after() im Selfhtml ansehen.
      Du kannst den Text von <item> dann mit einem rekursiven Template durchsuchen und zerlegen.

      Ok, danke mal so weit, vom Prinzip ist es jetzt schon klar (wobei ich eigentlich gehofft hatte es gibt zumindest bei XSLT 2 mittlerweile so etwas wie addslashes() in php ;) )

      Das nächst Problem ist jetzt aber, wie kann ich beim contains() auf Anführungszeichen abfragen?

      <xsl:when test="contains($string,'"')">

      ...geht ja auch nicht!

      Ich hab jetzt mal noch einen Umweg probiert, hab ersmal die Sonderzeichen mit escape-uri($string, true()) umgewandelt: " wird dann bspw. zu %22, dann kann ich zumindest mal nach diesem Zeichen suchen und es ersetzen... aber eine Umkehrfunktion zu escape() gibt es ja auch nicht...

      mfg
      Frank

      1. Hallo,

        Das nächst Problem ist jetzt aber, wie kann ich beim contains() auf Anführungszeichen abfragen?

        <xsl:when test="contains($string,'"')">

        ...geht ja auch nicht!

        <xsl:when test="contains($string,'"')">
        ...
        </xsl:when>

        MfG, Thomas

        --
        SVG - Learning By Coding
        http://svglbc.datenverdrahten.de/
        1. <xsl:when test="contains($string,'"')">
          ...
          </xsl:when>

          ...danke, bin ich grad auch drauf gekommen ;)

          mfg
          Frank

  3. Hallo,

    So wie ich das sehe, funktioniert eine replace-Funktion im JavaScript ja auch nicht, es müsste also irgendwie mit XSL gehen, bloß wie? Ich sitz da jetzt schon ewig dran, bekomme es aber nicht hin! oder steh ich da irgendwie auf dem Schlauch?

    Ein "Search and Replace"-Rezept gibt es hier: http://aspn.activestate.com/ASPN/Cookbook/XSLT/Recipe/65426.

    MfG, Thomas

    --
    SVG - Learning By Coding
    http://svglbc.datenverdrahten.de/
    1. Hallo,

      vielen Dank! mit diesem Template geht es ganz gut

      Ein "Search and Replace"-Rezept gibt es hier: http://aspn.activestate.com/ASPN/Cookbook/XSLT/Recipe/65426.

      um jetzt ein " zu ersetzen mit " muss man folgende Parameter mitgeben:

      <xsl:call-template name="replace-string">
      <xsl:with-param name="text" select="$string"/>
      <xsl:with-param name="from" select="'"'"/>
      <xsl:with-param name="to" select="'"'"/>
      </xsl:call-template>

      mfg
      Frank