Montag, 9. Juli 2007

Named entities haben in XSLT-Dateien nichts zu suchen!

Manchmal sind es die kleinen Dinge, die sich als Stolpersteine herausstellen. So auch heute wieder. Da möchte ich mir aus einer XML-Datei doch nur ein paar Werte holen und dann mittels XSLT als HTML ausgeben. Bei einem Link der zu erzeugen war sollte danach ein "angewinkelte Anführungszeichen" ausgegeben werden. (Bemerkung am Rande: Warum müssen Grafiker mit Links immer allerlei Spielchen treiben? ... blau und unterstrichen ... das waren noch Zeiten!) Ist ja kein Problem - dachte ich mir so in meinem jugendlichen Leichtsinn und setzte ein ». Doch das dankte der XSLT-Processor von PHP mir nur mit einem freundlichen Entity 'raquo' not defined in index.xslt und einigen daraus resultierenden Folgefehlern.

Also begab ich mich wieder auf die Suche nach einer Lösung für dieses kleine Problem. Und wer sucht der findet: Innerhalb einer XSLT-Datei dürfen keine named entities vorkommen. Sonderzeichen müssen statt dessen UTF-kodiert werden. Also in meinem Fall ».

Bei SELFHTML findet sich hierzu eine schöne übersichtliche HTML-Zeichenreferenz. Und möchte man nicht selber in der Tabelle suchen, dann gibt es ja noch den Unicode Code Converter von Richard Ishida.

Fazit:

Falsch:
<xsl:text>Ein angewinkelte Anführungszeichen rechts &raquo;</xsl:text>

Richtig:
<xsl:text>Ein angewinkelte Anführungszeichen rechts &#187;</xsl:text>

Kommentare:

  1. Quark. Wie in jeder XML Datei müssen named Entities einfach vorher deklariert werden, z.B. <!ENTITY ntilde "&#241;" >

    Das in einer XML Datei HTML Entities nicht funktionieren sollte klar sein.

    AntwortenLöschen
  2. Oh wenn es nur so einfach wäre. Wenn ich innerhalb eines <xsl:text> &ntilde; verwende, dann bekomme ich vom PHP-XSLT-Prozessor als Antwort:

    compilation error: file /_XSLT/index.xslt line 9 element text

    xsltParseTemplateContent: xslt:text content problem

    AntwortenLöschen
  3. Ok bisschen alt hat mir aber trotzdem auf die Sprünge geholfen. Entities sind erlaubt aber der XSLT Parser sollte auch so eingestellt sein dass er sie bearbeitet, bei libxslt etwa

    xmlSubstituteEntitiesDefaultValue = 1;

    AntwortenLöschen