Werbung einblenden Werbung ausblenden


Home / Tutorials / PHP Handbuch / Sablotron-XSLT Stylesheet parsen


Sablotron XML Dokumente über ein XSLT Stylesheet parsen

Wir beschreiben hier nur eine Möglichkeit, mit PHP XML Dokumente auszulesen. Mehr Informationen zu XML, XPATH und XSLT und wie diese Technologien mit PHP zusammenarbeiten finden Sie im XML Handbuch.
Der einzige XSLT-Prozessor, der aktuell von PHP unterstützt wird, ist der Sablotron. Dass im vorherigen Kapitel, siehe XML und XSL, mit dem Saxon-Prozessor und mit MSXML gearbeitet wurde hatte didaktische Gründe. Zur Veranschaulichung sind die beiden letzt genannten geeigneter, da die Fehleranalyse präziser ist. Zum "Üben" sind sie also günstiger. Hinsichtlich der XSLT- Stylesheets ist es unerheblich, welcher Prozessor verwendet wird. Um mit PHP XSLT-Stylesheets auszuführen muss die Syntax von XSLT bekannt sein, diese wurde in groben Zügen in dem Kapitel XML und XSL beschrieben. Zusätzlich muss man sich die Syntax aneignen, über die sich über PHP der Sablotron Prozessor steuern lässt. Der Sablotron Prozessor ist in der PHP Distribution 4.2.2 bereit enthalten. Damit PHP aber tatsächlich darauf zugreift, muss die Datei php.ini geändert werden. In der Datei php.ini gibt es einen Bereich, der alle möglichen Extensions aufführt. Es gibt also einen Bereich, der so aussieht.

...weitere Extensions.....

;extension=php_sybase_ct.dll
;extension=php_tokenizer.dll
;extension=php_w32api.dll
;extension=php_xslt.dll
;extension=php_yaz.dll
;extension=php_zlib.dll

...weitere Extensions....

Das Semikolon, vor der Zeile die aus php_xslt.dll verweist, ist zu entfernen.
extension=php_xslt.dll

Das war es dann schon auch. Wenn das getan ist, können wir gleich damit beginnen, eine XML-Datei via Sablotron durch ein XSLT Stylesheet in eine HTML Datei zu transformieren. Schauen wir uns alle drei hierfür benötigten Dateien nochmal an: Die XML Datei, die die eigentlichen Daten hält. Das XSLT Stylesheet, dass die Transformation durchführt und der PHP Skript, mit dem der Sablotron Prozessor angesteuert wird. Die Dateils wurden unter XML und XSL bereits besprochen.

Die XML Datei sieht so aus:
<?xml version="1.0" encoding="iso-8859-1" ?>
<buecher>
<buch>
<title lagerbestand="500">Der Mann ohne Eigenschaften</title>
<autor>Robert Musil</autor>
<erscheinungsjahr>1922</erscheinungsjahr>
</buch>
<buch>
<autor>Thomas Mann</autor>
<erscheinungsjahr>1917</erscheinungsjahr>
<title lagerbestand="300">Der Zauberberg</title>
</buch>
<buch>
<title lagerbestand="400">Die Stadt und die Hunde</title>
<autor>Mario Vargas Llosa</autor>
<erscheinungsjahr>1988</erscheinungsjahr>
</buch>
</buecher>

Das dazugehörige XSLT Stylesheet sieht so aus:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html><head><title>Test></title></head><body>
<xsl:apply-templates select="buecher/buch"/>
</body></html>
</xsl:template>
<xsl:template match="buch">
<table width="500">
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="autor"/>
<xsl:apply-templates select="erscheinungsjahr"/>
</table>
</xsl:template>

<xsl:template match="title">
<tr><td bgcolor="yellow"><xsl:value-of select="."/></td></tr>
</xsl:template>

<xsl:template match="autor">
<tr><td bgcolor="green"><xsl:value-of select="."/></td></tr>
</xsl:template>

<xsl:template match="erscheinungsjahr">
<tr><td><xsl:value-of select="."/></td></tr>
<tr><td><hr/></td></tr>
</xsl:template>
</xsl:stylesheet>

Die PHP Seite, die den Sablotron XSLT Prozessor steuert, sieht so aus:

<?

$zeiger = xslt_create();
$html_seite= xslt_process($zeiger, 'test.xml', 'test.xsl');
xslt_free($zeiger);
echo $html_seite;

?>

Die XML-Datei speichern wir unter test.xml, das XSLT-Stylesheet speichern wir unter test.xsl und das PHP-Skript unter testxml.php. Das alles speichern wir in der document-root des HTTP-Servers (bei Verwendung des Sambar Servers: c:/sambar/docs, bei Verwendung des Apache Servers:c:/apache/htdocs). Das wir zwar dann nicht funktionnieren und wir werden es gleich korrigieren, aber es ist didaktisch wertvoll, es erstmal so zu machen. Wir rufen dann den PHP Skript auf in dem wir im Browser folgendes eingeben:
http://127.0.0.1/teschto/testxml.php

Wir erhalten diese Fehlermeldung.
Warning: Sablotron error on line none: cannot open file 'C:/sambar/bin/test.xsl' in C:\sambar\docs\teschto\testxsl.php on line 5

Das heisst, dass der Sablotron-Prozessor die Dateien, die er verarbeiten soll, im Root-Verzeichniss des Servers erwartet, also da, wo die exe-Datei liegt, mit der er gestartet wird. Er will sie sehen in C:/sambar/bin. Dort findet er sie aber nicht und streikt. Ein ähnliches Bild ergibt sich auch bei Verwendung des Apache Servers. Dieser sucht im Verzeichnis c:/apache. Wir weichen der höheren Gewalt und richten im Verzeichnis bin ein Verzeichnis teschto ein und speichern die Dateien text.xml und text.xsl in diesem Verzeichnis ab. Anschliessend modifizieren wir die Datei textxml.php.

Et voilà. Nun klappt es. Auf dem Schirm erscheint dies:

Der PHP-Skript, der den Sablotron-Prozessor steuert, ist einfach zu verstehen. Mit der Zeile
$zeiger = xslt_create();

generieren wir einen Zeiger auf einen Sablotron Prozess. Alle Funktionen werden mit diesem Zeiger arbeiten. In der Zeile
$html_seite= xslt_process($zeiger, 'teschto/test.xml', 'teschto/test.xsl');

Übergeben wir die XML-Datei und die XSLT-Datei an den jeweiligen Prozess. Das Ergebnis der Funktion ist der Ergebnisbaum, in unserem Fall also eine HTML Seite. Diese lassen wir uns dann ausdrucken und beenden (xslt_free) diesen Prozess. Den Ergebnisbaum auf der Platte speichern
Will man den Ergebnissbaum, also das Ergebnis der Tranformation, in einer Datei abspeichern, sieht das so aus.


<?
$zeiger = xslt_create();
$treffer= xslt_process($zeiger, 'teschto/test.xml', 'teschto/test.xsl',ergebnis.htm);
xslt_free($zeiger);
echo $treffer;
?>

Wir erhalten jetzt im Ordner teschto eine Datei ergebnis.htm. In dieser ist der komplette Ergebnisbaum abgespeichert worden. Im Browser erscheint lediglich eine 1, als Zeichen dafür, dass der Prozess erfolgreich durchgeführt wurde. Wie also deutlich zu erkennen, setzt das Parsen von XML-Dokumenten mit PHP weniger fundierte Kenntnisse in PHP voraus, als fundierte Kenntnisse in XSLT.

vorhergehendes Kapitel