15. September 2007 XSLT als Template Engine in PHP - Teil 5
Tags: PHP, Template Engine, XHTML, XML & Co, XSLT
Heute möchte ich nur kurz auf ein Problem aufmerksam machen, welches Auftritt, wenn XHTML–Output generiert werden soll. XSLT bietet zwar grundsätzlich für HTML eine extra Outputmethode an,
allerdings habe ich mich persönlich längst von HTML verabschiedet und setze nur noch XHTML ein.
Wenn XHTML erzeugt werden soll gibt man einfach an:
<xsl:output method="xml" encoding="UTF-8" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" />
Da XHTML auf XML basiert werden alle Tags korrekt geschlossen. Wer jetzt lieber einen HTML–Standard verwenden möchte kann unter »method« einfach »html« angeben.
Browserkompatibilität
Leidiges Thema. Die XML–Methode erzeugt eine XML-Deklaration zu Beginn der Ausgabe. Bei XHTML ist die Deklaration optional und sollte sich eigentlich durch folgenden Aufruf unterdrücken lassen:
<xsl:output method="xml" encoding="UTF-8" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" omit-xml-declaration="yes" />
Leider ignoriert die XSL-Extension von PHP diese Angabe völlig. Die erzeugte XML–Deklaration sieht dann so aus:
<?xml version="1.0" encoding="UTF-8"?>Sie bewirkt, dass der Internet Explorer 6 und Opera 7.0x in den Quirks Mode wechseln und so womöglich Inhalte falsch dargestellt werden. Da die Deklaration nur optional ist werden wir sie also entfernen.
$content = $xp->transformToXML($xml); if(substr($content, 0, 5) == '<?xml') { $content = substr($content, strpos($content, '>') + 1); }
Hier suchen wir nach der XML-Deklaration am Anfang des Outputs. Wenn diese gefunden wird, müssen benötigen wir nur noch das Ende der Deklaration, welches wir mit »strpos« erhalten.
Das ist auch schon alles. Vergessen sollte man diesen Kniff allerdings nicht ansonsten könnten unschöne Effekte auftreten. Im nächsten Teil werde ich ein zeigen wie es möglich ist PHP–Funktionen im XSL–Stylesheet aufzurufen, was durchaus nützlich sein kann.
Achtung:
Freundlicherweise hat mich Mark darauf aufmerksam gemacht, dass ich »omit-xml-declaration« falsch geschrieben hatte. Dadurch hat sich in diesem Artikel leider ein Folgefehler eingeschlichen. Denn nun wird diese Angabe vom XSLTProcessor durchaus erkannt und auch berücksichtigt. Deshalb kann man sich den Kniff den ich vorher geschildert habe auch sparen.
weiter zum sechsten Teil dieser Beitragsreihe »
Ähnliche Artikel
Der Beitrag wurde am Samstag, den 15. September 2007 um 08:56 Uhr veröffentlicht und wurde unter PHP, XML & Co abgelegt. du kannst die Kommentare zu diesen Eintrag durch den RSS 2.0 Feed verfolgen. du kannst einen Kommentar schreiben, oder einen Trackback auf deiner Seite einrichten.

Im Artikel ist ein kleiner Tippfehler. wenn du den Namespace “xsl:” bei “xsl:omit-xml-declaration” rausnimmst, sollte es richtig funktionieren.
Das ist nicht nur ein kleiner Tippfehler. Deshalb danke, dass du mich darauf Aufmerksam gemacht hast. Dadurch erübrigt sich nämlich dieser Kniff mit dem manuellen entfernen des xml-Tags.