fredy: Problemem mit XSLT und Entities

Hi!

Wenn ich ein XML-Dokument mit Entities mit einem XSLT-Dokument
parse, so werde die Entities durch die entsprechenden Sonderzeichen
ersetzt, was jedoch nicht Sinnvoll ist da die Entities im durch
das parsen entstehenden HTML-Code erhalten bleiben sollen.

MEIN XML-DOKUMENT:
<?xml version=""1.0"" encoding=""UTF-16""?>
<data>&#246;äü</data> <!-- &#246; steht für ö -->

MEIN XSL-DOKUMENT:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<xsl:value-of select="/data/."/>
</xsl:template>
</xsl:stylesheet>

Das Ergebnis:
öäü

Wenn ich ein Entity unter CDATA setze, dann
wird das & im Entity durch ein & ersetzt.

Gibt es eine Lösung für dieses Problem oder hat
nur mein XML-Parser (MSXML) einen Bug ?

Danke und liebe Grüße
fredy

  1. Hi!

    Gibt es eine Lösung für dieses Problem oder hat
    nur mein XML-Parser (MSXML) einen Bug ?

    Nein, er hat keinen Bug (auch wenn es MS ist :),
    ja, es gibt eine Lösung:

    &#246;

    VG Simon

  2. Hallo,

    Gibt es eine Lösung für dieses Problem oder hat
    nur mein XML-Parser (MSXML) einen Bug ?

    wie bei Simon oder, wenn Du die XML-Datei nicht ändern darfst:

    <xsl:template match="/">
      <xsl:value-of select="/data/." disable-output-escaping="yes"/>
    </xsl:template>

    Gruß
    Franz

    1. Hallo,

      zu schnell gelesen...

      <xsl:template match="/">
        <xsl:value-of select="/data/." disable-output-escaping="yes"/>
      </xsl:template>

      ist natürlich Unsinn..., vergesst es einfach ;-)

      Gruß Franz

  3. Hallo nochmal,

    also, im XML-File benötigst Du: &#246;
    Soweit waren wir ja dank Simon schon ;-)

    Der XML-Parser macht daraus dann &#246;
    So bekommt der XSLT-Prozessor das übergeben und macht daraus wieder:
    &#246;

    Im Browser wird dies dann natürlich als &#246; angezeigt, weil der wieder das Entity auflöst. Im Source steht allerdings: &#246.

    Und so ist es auch korrekt, da ein XSLT-Prozessor Markup-Zeichen bei der Ausgabe maskiert: also aus & amp; macht.

    Um dies zu vermeiden, benötigst du nun das Attribut "disable-output-escaping" mit dem Wert "yes":

    <xsl:template match="/">
        <xsl:value-of select="/data/." disable-output-escaping="yes"/>
      </xsl:template>

    Das Ergebnis ist dann das Gewünschte: &#246;

    ABER: Der IE zeigt Dir natürlich wieder an: ö, weil er das Entity &#246; beim Parsen wieder auflöst. Im Quellcode ist es aber korrekt.

    So, nun musst du Dir nur noch raussuchen, was Du erreichen möchtest:

    • Dass es im Browser aussieht wie &#246; => ohne disable-output-escaping="yes"
    • Dass im Quelltext steht &#246; => mit disable-output-escaping="yes".

    So, ich hoffe nun sind alle Klarheiten beseitigt ;-)

    Gruß
    Franz