| 
Auslesen eines XML
Dokumentes mit XSLT unter Verwendung von Sablotron und PHP
XML in HTML Transformieren mittels Sablotron
und verwendung von XSLT Stylesheets
Den Ergebnisbaum auf der Platte speichern
| Auslesen
eines XML Dokumentes mit XSLT unter Verwendung von Sablotron
und PHP |
|
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
|
XML in HTML Transformieren mittels Sablotron und verwendung
von XSLT Stylesheets |
|
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 Details 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.
<table width="500">
<tr><td bgcolor="yellow">Der Mann ohne
Eigenschaften</td></tr>
<tr><td bgcolor="green">Robert Musil</td></tr>
<tr><td>1922</td></tr><tr><td><hr></td></tr>
</table>
<table width="500">
<tr><td bgcolor="yellow">Der Zauberberg</td></tr>
<tr><td bgcolor="green">Thomas Mann</td></tr>
<tr><td>1917</td></tr><tr><td><hr></td></tr>
</table>
<table width="500">
<tr><td bgcolor="yellow">Die Stadt und
die Hunde</td></tr>
<tr><td bgcolor="green">Mario Vargas
Llosa</td></tr>
<tr><td>1988</td></tr>
<tr><td><hr></td></tr>
</table>
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;
?>
Das Ergebnis sieht dann so aus.

Diese Datei befindet sich im Ordner teschto
und heisst 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.
|
 |