|

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.
|
 |