Das in der letzten Aufgabe erstellte CSS Style Sheet war zwar ausreichend, um eine erste Version einer formatierten XML-Seite zu erzeugen, jedoch sind die Einschräkungen von CSS relativ stark. Zwei Dinge fielen dabei besonders in's Auge:
Um diese Einschräkung zu umgehen, kann man die andere für XML geeignete Style Sheet Sprache verwenden, die Extensible Stylesheet Language (XSL). Die beiden Teile von XSL sind die XSL Transformations (XSLT) und die XSL Formatting Objects (XSL-FO), und von der Grundidee her wird mit Hilfe von XSLT (einer Programmiersprache) ein Baum von XSL-FO (einer DTD mit Formatiierungssemantik) erzeugt, der dann dargestellt wird. Da dies funktionierende XSL-FO Renderers voraussetzt, die momentan noch nicht weit verbreitet sind, beschränken wir uns in dieser Aufgabe auf die Anwendung von XSLT, um damit ein HTML Dokument zu erzeugen. Damit haben wir beide oben angegebenen Probleme gelöst:
In dieser Übung soll ein erstes kleines XSL Style Sheet geschrieben werden (eigentlich müsste man "XSLT Programm" sagen, aber das macht keiner, es hat sich die Sprachregelung "XSL Style Sheet" etabliert), dass Eure XML Dokumente aus Aufgabe 4 nach HTML transformiert. Wie beim CSS Style Sheet aus Aufgabe 6 ist es auch bei XSLT so, dass das Style Sheet für die gesamte Dokumentenklasse funktionieren soll, also für alle Dokumente gemäss der DTD aus Aufgabe 4, und nicht nur für ein oder zwei Dokumente. Es muss also darauf geachtet werden, dass alle in der DTD vorgesehenen Möglichkeiten, Dokumente gemäss der DTD zu erstellen, im XSL Style Sheet auch sinnvoll behandelt werden.
Damit Ihr nicht bei Null starten müsst, gibt es mit dieser Aufgabenstellung zwei einfache XSL Style Sheets als Starthilfe geliefert, die Ihr als simple1.xsl
und simple2.xsl
in Eurem Account speichern könnt. Speichert diese Beispiele am besten in dem Directory ab, in dem Ihr dann auch die Aufgabe bearbeiten wollt, und in dem Eure XML Dokumente liegen.
Um XSLT auf der Server Seite ausführen zu können, braucht man einen XSLT Processor, dies ist ein Programm, das XSL Style Sheets ausführen kann, an sich also nichts anderes als ein XSLT Interpreter. Es gibt eine ganze Reihe frei erhältlicher XSLT Processors, wir haben für diese Übung den Saxon XSLT Processor von Michael Kay ausgewählt, den mit einem Eurer Dokumente als Eingabe mit folgendem Kommando starten könnt:
~www01_10/a07/saxon mydoc.xml simple1.xsl
Saxon schreibt in diesem Fall das Resultat auf die Standard-Ausgabe, wenn Ihr es in ein File lenken wollt, könnt Ihr das mit dem normalen Unix-Mechanismus machen:
~www01_10/a07/saxon mydoc.xml simple1.xsl > mydoc1.html
Das Ergebnis dieses ersten Versuchs ist noch nicht wirklich befriedigend, weil die Ausgabe kein HTML, sondern einfach alles an Text ist, der innerhalb von Elementen vorkommt. Man kann sich berechtigterweise fragen, warum überhaupt etwas passiert, wenn doch gar kein Template definiert wurde. Dies lässt sich einfach durch die Built-in Rules von XSLT erklären, die zur Anwendung kommen, falls der Benutzer keine eigenen Templates für diese Match Patterns schreibt. Schaut man sich die Built-In Rules ein wenig genauer an, so kann man relativ einfach verstehen, was beim minimalistischen simple1.xsl
Style Sheet passiert ist.
Eure Aufgabe ist es nun, das XSL Style Sheet so zu erweitern, dass wirklich sinnvolles HTML erzeugt wird. Als ersten Ansatz könnt Ihr simple2.xsl
nehmen (damit dieses Style Sheet funktioniert, müsst Ihr auch noch foot.xml
in Eurem Directory speichern).
~www01_10/a07/saxon mydoc.xml simple2.xsl > mydoc2.html
Nun ist plötzlich zwar HTML erzeugt worden, aber es sind keine Inhalte Eures Dokuments mehr im HTML enthalten. Das liegt daran, dass nun ein Template existiert, das beim Ausführen instanziiert wird (das Template für das "/"
Match Pattern, aber in diesem Template wird nur festcodierter Inhalt generiert (und der Inhalt von foot.xml
hineinkopiert), aber nichts aus dem XML Dokument referenziert.
Ausgehend von simple2.xsl
sollt Ihr nun ein eigenes XSL Style Sheet schreiben, dass Dokumente gemäss Eurer DTD nach HTML transformiert. Folgende Hinweise sollten Euch diese Aufgabe einfacher machen:
<hr/>
oder <hr></hr>
. Ist Euer XSL Style Sheet kein well-formed XML, so bricht der XSLT Prozessor bereits vor der Ausführung der XSLT Anweisungen ab.Alles in allem ist der Start mit XSLT meist etwas harzig, aber nach erstaunlich kurzer Zeit hat man erste Ergebnisse und kann sich daran machen, sich weitere Sachen zu überlegen. Insbesondere steht man oft vor der Alternative, vieles Auszuprogrammieren, oder aber ein bisschen mehr nachzudenken und mehr Intelligenz in die XPaths zu legen. Ich bin sehr überzeugt von der zweiten Variante, also wenig Code und clevere XPaths, weil es sich in Form von kompakteren und deklarativeren Style Sheets bezahlt macht.
Wenn Ihr simple2.xsl
als Startpunkt benutzt, dann habt Ihr unten auf der erzeugten Seite gleich einen Link, mit dem Ihr das erzeugte HTML validieren könnt. Nun ist es prinzipiell unmöglich, das Style Sheet für alle möglichen XML Dokumente gemäss Eurer DTD zu testen (und die resultierenden HTML Dokumente zu validieren), und es dürfte auch eine sehr anspruchsvolle Aufgabe sein, nur aufgrund von DTD und XSLT zu entscheiden, ob in allen Fällen valides HTML erzeugt wird (hat jemand Lust auf eine wirklich anspruchsvolle Diplomarbeit? das wäre ein spannendes Thema und bisher gibt es noch keine veröffentlichten Arbeiten zu dieser Frage...). Aber zumindest für Eure beiden XML Dokumente aus Aufgabe 4 sollte das generierte HTML valid sein, falls nicht, müsst Ihr eben das Style Sheet entsprechend modifizieren.
Zur Abgabe ist unbedingt folgendes zu beachten: Damit ich die Lösungen einfacher testen kann, müsst Ihr nicht nur wie üblich eine HTML Seite mit der Dokumentation und Links auf DTD, XML, XSLT und generiertes HTML machen, sondern in die beiden XML Dokumente auch noch Processing Instructions einfügen, die auf das XSLT verweisen. Dies passiert ganz analog wie in Aufgabe 6, wo Ihr auf das CSS Style Sheet verwiesen habt. Diesmal verweist Ihr auf das XSL Style Sheet, und deshalb müsst Ihr als MIME Type jetzt text/xsl
angeben anstatt text/css
. Für die Verarbeitung mit Saxon ist diese Processing Instruction irrelevant, da Ihr beim Start von Saxon ja explizit XML und XSLT angebt. Aber für die Client-seitige Transformation mit dem IE5 ist die Processing Instruction notwendig, und ich werde diese Methode zur Korrektur benutzen. Zur Korrektur werde ich also die XML Dokumente benutzen, die auf das XSLT verweisen, und dann den generierten HTML Link zum Validieren des HTML benutzen. Wenn das in beiden Fällen erfolgreich ist, dann (und nur dann) ist die Aufgabe erfolgreich gelöst.
Und noch eine wichtige Warnung: Falls Ihr die Client-seitige Verarbeitung von XSL Style Sheets selber ausprobieren wollt, so müsst Ihr den IE5 von Hand patchen, die Standardinstallation verwendet eine Implementierung einer veralteten Vorversion des XSLT Standards, die von Microsoft implementiert wurde, als der XSLT Standard noch in Entwicklung war!
please send comments to www-vl@dret.net last modification on Tuesday, 05-Jun-2001 09:36:50 CEST |
![]() ![]() |