Catharina Northe: XSL:FO und XML: Unicode wird nicht interpretiert (die zweite)

Hallo nochmal,

mein alter Beitrag (http://forum.de.selfhtml.org/archiv/2006/6/t131634/) wurde schon ins Archiv verschoben, aber leider war meine Frage noch nicht ganz geklärt. Ich glaube, ich muss mein Problem nochmal anders formulieren: Ich habe eine XML-Datei, die ich mittels XSL:FO in ein Pdf umwandeln möchte. Das klappt wunderbar, so lange in der XML-Datei die "richtigen" Zeichen stehen, die nicht codiert sind. Mal ein Beispiel:

Daten in der XML-Datei:
<key><![CDATA[Hallo Welt]]></key>
Auslesen in der XSL-Datei:
<xsl:value-of select="key"/>
--> Anzeige im Pdf: Hallo Welt

Aber das funktioniert nicht bei japanischen Schriftzeichen, da diese in der XML-Datei codiert vorliegen. Das Problem:

Daten in der XML-Datei:
<key><![CDATA[&#12525;&#12472;&#12454;]]></key>
Auslesen in der XSL-Datei:
<xsl:value-of select="key"/>  oder  <xsl:value-of select="key" disable-output-escaping="yes"/> (gleicher Effekt)
--> Anzeige im Pdf: &#12525;&#12472;&#12454;
Aber gewünschte Anzeige: シルバ  (oder was ähnliches)

Die japanischen Schriftzeichen werden also auf dem Weg zum Pdf nicht in die richtigen Zeichen konvertiert, sondern es bleibt &#.....; stehen. Wenn ich nun in der XML-Datei mit Suchen-Ersetzen die Zeichenketten  <!CDATA[  und  ]]>  entferne, werden die japanischen Zeichen richtig interpretiert und statt &#12525; steht im Pdf z.B. シ. Also zum Beispiel:

Daten in der XML-Datei:
<key>&#12525;&#12472;&#12454;</key>
Auslesen in der XSL-Datei:
<xsl:value-of select="key"/>
--> Anzeige im Pdf: シルバ

Dann bekomme ich allerdings Probleme, wenn ich ein < oder & in den Daten der XML-Datei habe. Erst dachte ich, dass ich in der XML-Datei das < und & in &lt; und &amp; umwandelt könnte, aber wie soll ich das machen? Wenn ich < ersetzen will, erwische ich natürlich auch die ganzen anderen < Zeichen, die bleiben müssen. An der Generierung der XML-Datei kann ich schlecht etwas ändern. Ich kann die XML-Datei nur nachträglich durchparsen und etwas suchen und ersetzen. Das ganze müsste automatisch funktionieren können.

Ich hoffe, mein Problem ist etwas klarer geworden. Hätte jemand noch einen Tipp für mich?

Schöne Grüße,
Cathie

  1. Moin!

    Daten in der XML-Datei:
    <key><![CDATA[Hallo Welt]]></key>
    Auslesen in der XSL-Datei:
    <xsl:value-of select="key"/>
    --> Anzeige im Pdf: Hallo Welt

    Aber das funktioniert nicht bei japanischen Schriftzeichen, da diese in der XML-Datei codiert vorliegen. Das Problem:

    Daten in der XML-Datei:
    <key><![CDATA[&#12525;&#12472;&#12454;]]></key>
    Auslesen in der XSL-Datei:
    <xsl:value-of select="key"/>  oder  <xsl:value-of select="key" disable-output-escaping="yes"/> (gleicher Effekt)
    --> Anzeige im Pdf: &#12525;&#12472;&#12454;
    Aber gewünschte Anzeige: シルバ  (oder was ähnliches)

    Das ist aber logisch.

    Innerhalb von CDATA-Abschnitten haben alle in XML sonst aktiven Zeichen wie <, > und & ihre Sonderbedeutung verloren. Dementsprechend hast du in deinem XML stehen: "Ein Kaufmanns-Und, ein Doppelkreuz, die Zahl 12525 und ein Semikolon", aber nicht "die numerische Zeichenreferenz auf Unicodezeichen 12525".

    Numerische Zeichenreferenzen funktionieren nur außerhalb von CDATA-Bereichen. Innerhalb von CDATA-Bereichen mußt du die Zeichen direkt einfügen (was mit UTF-8 ja auch kein großes Problem ist).

    Wenn ich nun in der XML-Datei mit Suchen-Ersetzen die Zeichenketten  <!CDATA[  und  ]]>  entferne, werden die japanischen Zeichen richtig interpretiert und statt &#12525; steht im Pdf z.B. シ.

    Dann bekomme ich allerdings Probleme, wenn ich ein < oder & in den Daten der XML-Datei habe.

    Dann wirst du wohl in einem Schritt zwei Dinge gleichzeitig machen müssen: Entweder codiertst du in CDATA alle numerischen Zeichenreferenzen entsprechend der Encoding-Angabe korrekt, oder du wandelst alle <, > und & (bis auf die numerischen Zeichenreferenzen) innerhalb von CDATA in ihre Entities um und entfernst die CDATA-Begrenzung danach.

    Ich kann die XML-Datei nur nachträglich durchparsen und etwas suchen und ersetzen. Das ganze müsste automatisch funktionieren können.

    Das Problem ist, dass du die Bedeutungsebenen durcheinander gebracht hast. So wie "handy" in der englischen Sprache sehr wohl ein existenter Begriff ist, aber eben nicht "Mobiltelefon" meint, so stehen deine numerischen Zeichenreferenzen jetzt in CDATA, ohne dort das zu bedeuten, was du glaubst.

    Die spannende Frage ist: Wie konnte es dazu kommen?

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Hallo!

      Danke für die schnelle Antwort! Klingt alles logisch.

      Die spannende Frage ist: Wie konnte es dazu kommen?

      Tja, das habe ich mich auch schon gefragt. Die XML-Datei wird von einem Kollegen erzeugt, den ich schon gefragt habe, ob er nicht statt der &#-Codierungen einfach die japanischen Zeichen in die Datei schreiben kann. Da kam eine Antwort wie "das kommt so aus der Datenbank". Der Kollege ist morgen wieder da. Dann muss ich mit ihm mal besprechen, ob er die XML-Datei nicht mit den richtigen Zeichen generieren kann. Wäre ja das beste.

      Schöne Grüße,
      Cathie

  2. Hallo,

    Aber das funktioniert nicht bei japanischen Schriftzeichen, da diese in der XML-Datei codiert vorliegen. Das Problem:

    Daten in der XML-Datei:
    <key><![CDATA[&#12525;&#12472;&#12454;]]></key>
    Auslesen in der XSL-Datei:
    <xsl:value-of select="key"/>  oder  <xsl:value-of select="key" disable-output-escaping="yes"/> (gleicher Effekt)
    --> Anzeige im Pdf: &#12525;&#12472;&#12454;
    Aber gewünschte Anzeige: シルバ  (oder was ähnliches)

    Wenn bei:
    <key><![CDATA[&#12525;&#12472;&#12454;]]></key>

    und
    <xsl:value-of select="key" disable-output-escaping="yes"/>

    dasselbe Ergebnis rauskommt wie bei:
    <xsl:value-of select="key"/>

    verwendest du einen fehlerhaften XSL-Prozessor.

    Dein Problem ist, dass du nach der Transformation ebnfalls XML hast und so auf die das < und & achten musst.

    Wenn es nur um die Zeichen < und > ginge könntest du es noch so hinbekommen:

    <key><![CDATA[&#12525;&#12472;&#12454;<<<<<<  xcyvv  gfhsdf >>>>>>]]></key>

    <xsl:value-of select="translate(key, '&lt;&gt;', '&#8249;&#8250;')" disable-output-escaping="yes" />

    Ausgabe: ロジウ‹‹‹‹‹‹ xcyvv gfhsdf ››››››

    Das Problem besteht aber bei &, denn das kannst du nicht ersetzen, da du damit auch die & bei den Zeichenreferenzen ersetzen würdest.
    Außer daß man ein Script schreibt, welches auf &# achtet und nur andere & ersetzt, fällt mir jetzt nichts ein (bzw. schon: die Verwendung vom XSLT 2, wo du diese Ersetzungen mit einem regulären Ausdruck lösen könntest)

    Grüße
    Thomas

    1. Hallo!

      Wenn bei:
      <key><![CDATA[&#12525;&#12472;&#12454;]]></key>

      und
      <xsl:value-of select="key" disable-output-escaping="yes"/>

      dasselbe Ergebnis rauskommt wie bei:
      <xsl:value-of select="key"/>

      verwendest du einen fehlerhaften XSL-Prozessor.

      Ich habe es gerade nochmal durchgespielt. Ich hatte das "disable-output-escaping" anscheinend nur ohne CDATA getestet. Mit CDATA kommen wirklich japanische Schriftzeichen heraus! *freu* Jetzt muss ich nur noch < und & ersetzen, aber das kann ich auch meinem Kollegen überlassen, der die XML-Datei erzeugt. Ich denke, das Ersetzen fällt bei der Erzeugung der XML-Datei nicht so schwer.

      Vielen Dank!
      Cathie