Der Vollständigkeit halber geben wir abschließend hier noch das DSSSL-Stylesheet an, mit dem die Ausgabe der Paketbeschreibungen in HTML durchgeführt wird. Die Aufgabe des Stylesheets ist es tatsächlich nur, reines HTML zu erzeugen, ohne die in Abbildung 60 auf der linken Seite sichtbare Navigationsleiste. Diese wird auf andere Weise in jede Seite auf diesem Server eingebaut (natürlich auch mit DSSSL). Eine weitere Besonderheit kennzeichnet das Stylesheet: Zu Beginn werden einige Variablen definiert, die zur Laufzeit (mit dem Jade-Parameter -V) umdefiniert werden. Da es sich hierbei ausschließlich um Steueroptionen für die Suchfunktion auf dem Server handelt, ist deren genaue Bedeutung nicht wichtig, um die Funktionsweise des Stylesheets zu verstehen. Dennoch einige erläuternde Worte: Das Stylesheet erfüllt zwei Aufgaben, einerseits dient es dazu, mehrere (evtl. alle) Softwarepakete auszugeben und andererseits auch dazu, nur eins auszugeben. Das Stylesheet transformiert nicht nur, sondern sucht auch in den Daten. Wenn nicht alle Pakete ausgegeben werden (Variable alle-pakete-ausgeben ist false), dann wird nur das Paket ausgegeben, dessen Name mit dem Inhalt von ausgabe-paketname übereinstimmt. Außerdem werden bei einer einzelpaket-ausgabe (Wert true) die Links anders gehandhabt, da sie in diesem Fall als dokumentinterne Links realisiert werden sollen.
Die Variablenbelegung muss von außen
in das
Stylesheet eingebracht werden. Es handelt sich dabei in gewissem
Sinne um ein Stylesheet mit dynamisch (d.h. zur Laufzeit)
generiertem Inhalt. Im Standard sind
keine Vorkehrungen für solche Anwendungen getroffen.
<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN"> (declare-flow-object-class element "UNREGISTERED::James Clark//Flow Object Class::element") (declare-flow-object-class empty-element "UNREGISTERED::James Clark//Flow Object Class::empty-element") (declare-flow-object-class entity-ref "UNREGISTERED::James Clark//Flow Object Class::entity-ref") (declare-flow-object-class document-type "UNREGISTERED::James Clark//Flow Object Class::document-type") (declare-characteristic preserve-sdata? "UNREGISTERED::James Clark//Characteristic::preserve-sdata?" #t) ; ANFANG externe Variablen-Definition (define ausgabe-paketname "") (define alle-pakete-ausgeben #t) (define einzelpaket-ausgabe #f) ; steuert die Syntax der Links auf andere Pakete ; ENDE externe Variablen-Definition (element sysinst (make sequence (make document-type name: "HTML" public-id: "-//W3C//DTD HTML 4.0 Transitional//EN") (make element gi: "HTML" (make sequence (make element gi: "HEAD" (make sequence (make element gi: "title" (literal "Softwarepakete")) (make element gi: "style" attributes: (attribute (list "type" "text/css")) (literal "th.version { background: #cccccc; color: black }")))) (make element gi: "body" (process-children)))))) (element swpaket (make sequence (if (have-ancestor? "sysinst" (current-node)) (empty-sosofo) (make sequence (make document-type name: "HTML" public-id: "-//W3C//DTD HTML 4.0 Transitional//EN") (make element gi: "HEAD" (make sequence (make element gi: "title" (literal "Softwarepakete")) (make element gi: "style" attributes: (attribute (list "type" "text/css")) (literal "th.version { background: #cccccc; color: black }"))))) ) (let ((paketname (attribute-string "name"))) (if (or (string=? ausgabe-paketname paketname) alle-pakete-ausgeben) (make sequence (make element gi: "H1" (make element gi: "a" attributes: (attribute (list "name" paketname)) (literal paketname))) (make element gi: "table" attributes: (attribute (list "border" "1" "cellpadding" "5")) (process-matching-children-in-order (list "beschreibung" "size" "def-version" "new-version" "kategorie" "version")))) (empty-sosofo))))) (element beschreibung (std-eintrag "Kurzbeschreibung")) (element inst-dir (std-eintrag "Installationsverzeichnis")) (element (swpaket size) (std-eintrag "Gesamtgröße")) (element def-version (std-eintrag "Default-Version")) (element new-version (std-eintrag "Neuste Version")) (element kategorie (zeile (literal "Kategorie") (process-children))) (element (kategorie kategorie) (make sequence (literal "/") (process-children) )) (element version (let ((versionsnr (attribute-string "nummer")) (supkat (attribute-string "support-kategorie"))) (make sequence (make element gi: "TR" (make element gi: "th" attributes: (attribute (list "colspan" "2" "class" "version" "align" "left" "bgColor" "white")) (literal (string-append "Version " versionsnr)))) (zeile (literal "Support-Kategorie") (literal supkat)) (process-matching-children-in-order (list "beschreibung" "size" "def-version" "new-version" "kategorie" "doku"))))) (element doku (let* ((dokuart (attribute-string "art")) (dokuort (attribute-string "ort")) (instdir (data (node-list-map (lambda (snl) (if (string=? (gi snl) "INSTDIR") snl (empty-node-list))) (children (ancestor "swpaket"))))) (paketname (attribute-string "name" (ancestor "swpaket"))) (versionsnr (attribute-string "nummer" (ancestor "version"))) (process-dok (lambda (text) (cond ((string=? dokuart "CATMAN") (make-url "" (string-append "/CGI/man2www"instdir "/" versionsnr "/" dokuort "?paket=" paketname "/" versionsnr) text)) ((string=? dokuart "LOKAL") (make-url "file://" (string-append instdir "/" versionsnr "/" dokuort) text)) ((string=? dokuart "URL") (make-url "" dokuort text)) ((string=? dokuart "INFO") (literal text)) (else (make entity-ref name: "nbsp")))))) (make sequence (if (first-sibling?) (make element gi: "tr" (make sequence (make element gi: "th" (literal "Dokumentation")) (make element gi: "td" (process-dok (data (current-node)))))) (make element gi: "tr" (make sequence (make element gi: "th" (make entity-ref name: "nbsp")) (make element gi: "td" (process-dok (data (current-node)))))))))) (define (make-url praefix adresse text) (make element gi: "a" attributes: (attribute (list "href" (string-append praefix adresse))) (literal text))) (define (zeile feldA feldB) (make element gi: "tr" (make sequence (make element gi: "th" feldA) (make element gi: "td" feldB)))) (element size (std-eintrag "Größe")) (element verweis (let ((paket (attribute-string "PAKET")) (praefix (if einzelpaket-ausgabe "/CGI/paket2html?paket=" "#")) ) (make element gi: "a" attributes: (attribute (list "href" (string-append praefix paket))) (literal paket)))) ; ---------------------------------------------------------- (define (std-eintrag text) (make element gi: "TR" (make sequence (make element gi: "TH" (literal text))) (make element gi:"TD" (process-children)))) ; ---------------------------------------------------------- (define (process-matching-children-in-order ordered-list) (if (null? ordered-list) (empty-sosofo) (make sequence (process-matching-children (car ordered-list)) (process-matching-children-in-order (cdr ordered-list))))) (define (attribute aliste) (if (null? aliste) (list) (cons (list (car aliste) (car (cdr aliste))) (attribute (cdr (cdr aliste))))))