Per DSSSL eine HTML-Datei zu generieren bedeutet eigentlich, etwas zu tun, das DSSSL in der Jade-Implementierung gar nicht kann. Denn das wäre Aufgabe der Transformation Language (die Jade nicht beherrscht). James Clark hat als Alternative eigene Flow Objects für den SGML-Output kreiert. Näheres dazu ist Kapitel 9 zu entnehmen, denn für das Buchmanuskript respektive seinen Output waren diese Objekte natürlich ebenfalls Voraussetzung. Im Folgenden sind jeweils nur die gerade bedeutsamen Teile des Stylesheets abgedruckt; am Ende des Kapitels ist es vollständig nachzulesen.
Nach den Präliminarien geht es an die Default-Regel. Sie ist dann anzuwenden, wenn keine spezielle Anweisung für ein Element vorgegeben ist.
(default (empty-sosofo))
In diesem Fall heißt die Vorgabe: Tue nichts. Dafür steht die leere Spezifikation einer Sequenz von Flow Objects (Specification of a Sequence of Flow Objects, SOSOFO). Solche Vorgaben dienen dazu, sich die unnötigen Anweisungen für einzelne Elemente zu sparen. Den eigentlichen Anfang macht das Element lithist, das Top-Level-Element des Dokuments. In ihm ist festgelegt, dass es sich um ein HTML-Dokument nach der W3C-Vorgabe handelt, und es generiert ein Top-Level-Element html, in das alle weiteren eingebettet sind.
(element lithist (make sequence (make document-type name: "HTML" public-id: "-//W3C//DTD HTML 4.0//EN") (make element gi: "HTML" (make sequence (make element gi: "HEAD" ; ----- hier werden HEAD, META und LINK generiert (make sequence (make element gi: "TITLE" (literal "Dichter und Schriftsteller")) (make empty-element gi: "LINK" attributes: (cons (list "REL" "STYLESHEET") (cons (list "TYPE" "text/css") (cons (list "HREF" "/style/litanw.css") (cons (list "TITLE" "Literatur") '()))))) (make empty-element gi: "META" attributes: (cons (list "name" "generator" ) (cons (list "content" "from XML source and Style Sheet via James Clark's Jade") (cons (list "name" "author") (cons (list "content" "Henning Behme") '()))))))) (make element gi: "BODY" ; --- Überschriften und Bearbeitung weiterer Elemente ) ))))
Das zweimalige make sequence sorgt dafür, dass der Dokumenttyp und das Top-Level-Element sowie die danach vorkommenden Elemente für sich ebenfalls eine Folge bilden (innerhalb von html). Dabei handelt es sich um zwei weitere: head und body.
(make element gi: "BODY" (make sequence (make element gi: "H1" attributes: (cons (list "class" "de") '()) (literal "Dichter und Schriftsteller")) (make element gi: "H1" attributes: (cons (list "class" "en") '()) (literal "Poets and Writers")) )) ; --- weitere Angaben zum Body
Der resultierende HTML-Code sieht folgendermaßen aus:
<BODY> <H3 class="de">Dichter und Schriftsteller</H3> <H3 class="en">Poets and Writers</H3>
Im body kommt ebenfalls make sequence als erstes vor, weil alles, was hier seinen Platz haben soll, an dieser Stelle nacheinander abgearbeitet wird. Gäbe es in der XML-Instanz der Literaturgeschichte Elemente wie die oben generierten H1-Überschriften, wären sie ebenfalls leicht zu extrahieren. Allerdings müsste man für den head diese Überschrift mit Hilfe eines besonderen Modus ausgeben, wenn man aus dem Überschriftenelement auch einen Titel erzeugen will.
Modi, dies zur Erinnerung, dienen dazu, Elemente einer Sonderbehandlung zu unterziehen. Dies insbesondere dann, wenn Elemente mehr als einmal in der Ausgabe vorkommen sollen. Ein Inhaltsverzeichnis ist das beliebteste Beispiel: Dort müssen Kapitelüberschriften schon einmal auftauchen, abgesehen von ihrem angestammten Platz.
Irritierend mag auf den ersten Blick
sein, dass dieses Style Sheet (DSSSL) über das
link-Element ein ganz anderes
(CSS) voraussetzt und referenziert. Grund dafür
ist, dass die Ausgabe auch in HTML formatiert
sein sollte, um beispielsweise Überschriften in unterschiedliche Farben
anzuzeigen (je nach Sprache). Statt der veralteten
HTML-Elemente font etc. (das W3C
rät von ihnen ab) kommt hier ein Cascading Style Sheet zum
Einsatz, das Vorgaben für die einzelnen Elemente macht. Es
hier ebenfalls abzudrucken führte zu weit, weil es vom
eigentlichen Thema ablenkteOnline ist auch das
Cascading Style Sheet einsehbar.. Auf jeden Fall
macht die Arbeit mit CSS auch
DSSSL-Style-Sheets komplexer, wenn die
CSS-Anweisungen ins HTML-Dokument
geschrieben werden müssen. Mit font et
cetera wäre das allerdings nicht
besser.
Innerhalb des body, im
Style Sheet innerhalb des Elements lithist, stehen bis auf wenige Details
alle wichtigen Vorgaben für das
HTML-Dokument. Abgesehen von einigen
Überschriften (h1 und h3 mit den Style-Sheet-Klassen
de und en) ist ein
Formular (siehe unten stehendes Listing) Hauptbestandteil des
body, das dazu auffordert, aus
einer Liste eine Autorin beziehungsweise einen Autor
auszusuchen und auf okay
zu klicken:
(make element gi: "FORM" attributes: (cons (list "METHOD" "POST") (cons (list "ACTION" "/cgi-bin/xml/xmla") '())) (make element gi: "SELECT" attributes: (cons (list "NAME" "AUTHOR") (cons (list "SIZE" "15") '())) (process-children)) (make element gi: "INPUT" attributes: (cons (list "TYPE" "SUBMIT") (cons (list "VALUE" "okay") '())) (empty-sosofo)))
Bei diesem Formular ist strukturiertes Denken im Sinne des Flow-Object-Baums sinnvoll, weil sonst einzelne Elemente des Formulars im falschen Flow Object landen. Hier dreht es sich darum, dass im Element body bis auf eine Kleinigkeit des Formulars (das, was aus dem Element author ausgegeben werden soll —, hier nur der Name) bereits alles enthalten sein muss, auch der Nachsatz mit der Angabe der letzten Veränderung.
Das Element form erhält über attributes die Methode post und die Aktion /cgi-bin/xml/xmla zugewiesen. Außerdem beinhaltet das Formular ein select-Statement und einen submit-Button. Innerhalb von select steckt die Abarbeitung der Autoreneinträge (process-children), so dass dort (im Element author) nicht mehr viel zu geschehen hat ...
(element author (make element gi: "OPTION" attributes: (cons (list "VALUE" (attribute-string "ID")) '()) (process-matching-children 'name)))
Jade generiert aus diesen Zeilen für jeden Autor einen Eintrag, der folgendermaßen aussieht:
<OPTION VALUE="AUE">Hartmann von Aue</OPTION>
Dabei extrahiert die Funktion attribute-string aus dem Attribut id die eindeutige Kennung des jeweiligen Autors, so dass im HTML-Dokument Strings landen, die wie oben für Hartmann von Aue stehen (AUE). Wie das Formular aussieht, zeigt die folgende Abbildung:
Abbildung 56: So einfach es geht: nur ein Formular mit select und vielen (hier nur teilweise sichtbaren) Optionen
Was beim Klick auf den okay
-Button passiert,
regelt ein Skript (in diesem Fall Perl),
das die vom Formular per post
weitergegebene id des Autors
auswertet und aus vorgegebenen Teilen eines zweiten
Stylesheets eine Autorenseite generiert. Das Skript ist am
Schluss dieses Kapitels abgedruckt und sollte niemandem, der
schon einmal Perl ausprobiert hat,
Kopfschmerzen bereiten.