30. August 2007 XSLT als Template Engine in PHP - Teil 3

in Kategorie PHP, XML & Co

Tags: , , ,


Wie XML dynamisch generiert werden kann wissen wir bereits. Nun geht es darum die XSLT–Stylesheets möglichst geschickt aufzubauen. Hier gibt es ein paar Hürden zu bewältigen an die man meistens zuvor gar nicht denkt. Wer Teil 1 oder Teil 2 dieser Beitragsreihe verpasst hat, sollte dies zuvor noch nachholen.

Eine weit verbreitete Möglichkeit eine kleine Website aufzubauen ist die Verwendung einer head.php und foot.php in der das HTML–Grundgerüst — sprich Layout und Navigation — enthalten ist, um diese immer wiederkehrenden Elemente zentral verwalten zu können. So ähnlich möchten wir das natürlich auch in XSLT verwenden. Allerdings muss in einem XSL–Template vollständig valider HTML bzw. XML Code stehen. Wir müssen also jeden Tag den wir innerhalb eines Templates öffnen auch in dem selben wieder schließen. Daraus folgt, dass die Trennung in head.xsl und foot.xsl gar nicht möglich ist, da wir sonst den HTML–Tag in head.xsl öffnen und in foot.xsl erst wieder schließen würden.

Das zentrale Root–Template

Als Konsequenz aus den bisherigen Überlegungen folgt ganz eindeutig, dass wir ein zentrales Template benötigen, welches immer auf den Wurzel–Tag der zu transformierenden XML–Daten angewandt wird. Eines solches Root–Template könnte folgendermaßen aussehen:

<?xml version="1.0" encoding="utf-8"?>
 
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
<xsl:template match="/">
 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
	<head>
		<title>Eine Website generiert durch XSLT</title>
	</head>
	<body>
		<h1>Eine Website generiert durch XSLT</h1>
 
		<xsl:apply-templates />
 
	</body>
</html>
 
</xsl:template>
 
</xsl:stylesheet>

Das XSL–Template wird durch »match=”/”« auf den obersten Tag der XML–Hierarchie angewandt. In diesem Template können nun Layout, Navigation, usw. definiert werden. Der eigentliche Content der aktuellen Seite wird dann in einem spezifischeren XSL–Template definiert und an der passenden Stelle bei »apply-templates« eingesetzt.

spezifische Templates

root.xsl wird nie direkt aufgerufen, sonder immer nur durch das spezifische Template. Für die Startseite könnten wir zum Beispiel ein home.xsl Stylesheet definieren:

<?xml version="1.0" encoding="utf-8"?>
 
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
<xsl:output method="xml" encoding="UTF-8" indent="yes" 
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" />
 
<xsl:include href="root.xsl" />
 
<xsl:template match="/home">
 
	<h2><xsl:value-of select="title" /></h2>
	<p><xsl:value-of select="text" /></p>
 
</xsl:template>
 
</xsl:stylesheet>

Da dieses Stylesheet einen Output erzeugt, weil es direkt vom Browser oder von einem XSLT–Prozessor aufgerufen wird müssen wir diesen Output durch das xsl:output–Tag näher definieren. Hier gibt es einige Hürden auf die im späteren Einsatz der Templateengine zu achten ist. Darauf werde ich in einem anderen Beitrag eingehen.

Der Übersicht halber ist es zu Empfehlen die Templates der einzelnen Seiten in einzelne Stylesheets zu trennen, was im obigen Beispiel auch geschehen ist. Deshalb müssen wir das Root–Template über »xsl:include« einbinden. Das Template aus dem Beispiel bezieht sich auf ein Wurzel–Element namens »home«. Ist dieses Element nicht vorhanden wird das Template erst gar nicht aufgerufen.

Die passende XML–Datei könnte zum Beispiel so aussehen:

<?xml version="1.0" encoding="utf-8"?>
 
<?xml-stylesheet type='text/xsl' href='home.xsl'?>
 
<home>
	<title>Dies ist die Startseite</title>
	<text>und ein bisschen Text.</text>
</home>

Fazit

Bei dieser Vorgehensweise muss das Wurzel–Element der XML–Datei immer den Namen des passenden Templates erhalten. Dies ist aber kein Problem selbst wenn wir das XML dynamisch generieren. Wenn die Stylesheet–Dateien dann auch noch gleich benannt sind wie das Wurzel–Element kann die korrekte Datei dem XSLT–Prozessor ganz leicht übergeben werden.

Es gibt viele Möglichkeiten seine Templates aufzubauen. Mir persönlich erscheint diese aber eine der sinnvollsten zu sein. Im nächsten Teil geht es dann um den Einsatz der XSL–Extension und wie man damit die XSL–Transformation serverseitig durchführt.

Die Dateien zu den Beispielen können hier heruntergeladen werden:

Die home.xml kann direkt in einem Browser aufgerufen werden, der XSLT unterstützt.

weiter zum vierten Teil dieser Beitragsreihe »

Ähnliche Artikel


Der Beitrag wurde am Donnerstag, den 30. August 2007 um 11:39 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.

Kommentare

Keine Reaktion zu “XSLT als Template Engine in PHP - Teil 3”.

Einen Kommentar schreiben