World Wide Web - Grundlagen und Technologie

Aufgabe 7 (XSLT)

XSL Style Sheet für eine XML DTD

Abgabe bis 11.6.2001


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:

  1. Die sehr unterschiedliche Unterstützung von CSS durch Browser hat zur Folge, dass die Darstellungen je nach Browser stark voneinander abweichen, insbesondere wenn man die etwas neueren (und interessanteren...) Features von CSS2 benutzt, und sich nicht auf die sehr einfachen Funktionen von CSS1 einschränken will.
  2. Trotz viel neuer Funktionalität in CSS2 bleibt mit CSS die grundlegende Einschräkung, dass das Dokument nicht in seiner Struktur verändert werden kann. Letztlich bietet CSS eben nicht mehr als einen Mechanismus, Formatierungsinformationen mit (über zum Teil recht komplex kontextabhägig selektierten) Elementknoten im Dokumentbaum zu verbinden. Da ein XML Dokument aber häfig nicht genau die Struktur hat, die für die Präsentation verwendet werden soll, ist dies eine recht grosse Einschräkung.

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:

  1. Wenn wir (wie in dieser Übung) die Transformation von XML nach HTML auf der Server-Seite machen, dann erzeugen wir damit normales HTML, das von jedem Browser interpretiert werden kann. Auch hier müssen wir natürlich darauf achten, dass wir plattformunabhängiges HTML erzeugen, aber das ist nicht allzu schwierig und einfacher als die Entwicklung von plattformunabhängigem CSS.
  2. Durch die Tatsache, dass XSLT eine Programmiersprache ist, kann man beliebige strukturelle Änderungen am Dokument vornehmen, insbesondere kann man mit Hilfe der in XSLT enthaltenen XML Path Language (XPath) sehr einfach Teile des XML Dokuments identifizieren und zur Erzeugung des HTML Dokumentes verwenden.

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.


Schritt 1 (Anwendung zweier einfacher Beispiel XSL Style Sheets)

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.


Schritt 2 (Verfeinerung des XSLT und Anpassung an die eigenen Bedürfnisse)

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:

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.


Schritt 3 (Validieren der resultierenden HTML Dokumente)

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
valid CSS!valid HTML 4.01!