Oberseminar Dokumentenmanagement, Webdesign und Entwicklungswerkzeuge Das Apache XML Projekt Cocoon und eXtensible Server Pages Markus Minnameier Lehrstuhl für Informatik II Das Apache XML Projekt: Cocoon und XSP 2 Inhaltsverzeichnis 1 2 DAS APACHE XML PROJEKT................................................................................................................ 3 1.1 DIE ZIELE DES APACHE XML PROJEKTS ................................................................................................... 3 1.2 ENTWICKLUNG DES APACHE XML PROJEKTS ........................................................................................... 3 1.3 DIE EINZELNEN TEILPROJEKTE................................................................................................................... 4 COCOON ..................................................................................................................................................... 5 2.1 DAS COCOON WEB-MODELL ..................................................................................................................... 6 2.2 FUNKTIONSWEISE VON COCOON ................................................................................................................ 7 2.3 COCOON PROCESSING INSTRUCTIONS (PI) ................................................................................................. 9 2.4 BROWSER-ABHÄNGIGE FORMATIERUNG .................................................................................................... 9 COCOON CACHE SYSTEM .................................................................................................................................. 10 2.6 3 2.6.1 XML ............................................................................................................................................... 10 2.6.2 XSL ................................................................................................................................................ 11 EXTENSIBLE SERVER PAGES (XSP) ................................................................................................. 12 3.1 4 VERWENDETE TECHNOLOGIEN ................................................................................................................ 10 WICHTIGE XSP-TAGS .............................................................................................................................. 13 3.1.1 <xsp:page> ................................................................................................................................... 13 3.1.2 <xsp:structure> und <xsp:include> ............................................................................................. 13 3.1.3 <xsp:logic> und <xsp:content> ................................................................................................... 14 3.1.4 <xsp:expr> .................................................................................................................................... 14 3.2 XSP-BIBLIOTHEKEN ................................................................................................................................ 15 3.3 BEISPIEL FÜR TRENNUNG VON LOGIK UND INHALT ................................................................................. 15 AUSBLICK................................................................................................................................................. 17 ANHANG ............................................................................................................................................................. 18 NOTIZ.XML ........................................................................................................................................................ 18 NOTIZ-XSP.XSL .................................................................................................................................................. 18 NOTIZ.XSP .......................................................................................................................................................... 19 NOTIZ2HTML.XSL............................................................................................................................................... 20 BIBLIOGRAPHIE .............................................................................................................................................. 22 Das Apache XML Projekt: Cocoon und XSP 3 1 Das Apache XML Projekt 1.1 Die Ziele des Apache XML Projekts Als im Februar 1999 das Apache XML Projekt ins Leben gerufen wurde, hatte man drei Zielrichtungen im Auge [1]: • Die Erstellung von hochwertigen XML-Lösungen, die kommerziellen Produkten in nichts nachstehen. • Die Ermöglichung von Feedback an standardisierenden Organisationen (wie z.B. IETF und W3C) aus der Sicht von Entwicklern. • Eine Austauschplattform für alle Aktivitäten innerhalb des Apache Projekts, die mit XML zu tun haben. Diese Ziele entstanden aus der einfachen Überlegung den Apache Webserver XML-fähig zu machen. 1.2 Entwicklung des Apache XML Projekts Das Apache XML Projekt wurde im Februar 1999 ins Leben gerufen und entstand mit dem Teilprojekt Cocoon, das im Rahmen des Java Apache Projekt entwickelt wurde. Mit der Gründung eines eigenständigen Open Source Projektes trug man der stetig wachsenden Nachfrage nach XML- und XSL-Tools Rechnung. Mittlerweile umfasst das Apache XML Projekt acht Teilprojekte. Es wird von Edd Dumbill als Meilenstein in der XML und Open Source Entwicklung betrachtet [3]. Denn verschiedene kommerzielle Firmen wie SUN und IBM leisteten einen entscheidenden Beitrag bei der Entstehung, indem sie beispielsweise ihre Source Codes für die XML Parser und XSLT Prozessoren zur Verfügung stellten. Das Apache XML Projekt: Cocoon und XSP 4 1.3 Die einzelnen Teilprojekte Mittlerweile ist das Projekt auf acht Teilprojekte angewachsen, die hier nur sehr knapp umrissen werden: • Xerces Ein XML Parser, der in Java und C++ zur Verfügung steht. • Xalan: Ein XSLT Stylesheet Prozessor, der ebenfalls in Java und C++ existiert. • Cocoon Ein auf XML basierendes Web Publishing Framework in Java. • FOP John Taubers‘ FOP für XSL Formatting Objects (FO) in Java. • Xang Dient zur schnellen Entwicklung von Dynamic Server Pages in JavaScript. • SOAP Simple Object Access Protocol. • Batik Ein auf Java basierendes Toolkit für Skalierbare Vektor Grafiken (SVG). • Crimson Ein weiterer XML Parser. Das Apache XML Projekt: Cocoon und XSP 5 2 Cocoon „Cocoon ist ein Publishing Framework Servlet, daß mittels seines modularen Reaktorkonzepts ein XMLQuelldokument je nach anfragendem Client in ein beliebiges Zielformat transformiert“ [1]. In den folgenden Kapiteln wird hauptsächlich das Teilprojekt Cocoon näher betrachtet. Cocoon, das zur Zeit in der Version 1.8 vorliegt. kann man sozusagen als Herzstück des Apache XML Projekts betrachten. Wichtige Merkmale von Cocoon sind die 100%-ige Realisierung in Java und der modulare Aufbau. Cocoon ist somit auf vielen Plattformen einsetzbar, auf denen eine Servlet Engine läuft, denn Cocoon ist eigentlich ein Servlet und somit Bestandteil eines Servers. Durch den modularen Aufbau und der Verwendung von Standardschnittstellen lassen sich leicht einzelne Komponenten austauschen. Voraussetzung ist nur, dass diese Komponenten wiederum zu 100% in Java erstellt sind. Auch weitergehende Anwendungen sind somit realisierbar. Abbildung 1: Vereinfachtes Verarbeitungsmodell von Cocoon. [5] Abbildung 1 zeigt ein vereinfachtes Verarbeitungsmodell von Cocoon. Das Servlet erstellt anhand der Eingabeparameter beispielsweise eine HTML-Seite. Hierzu wird ein XMLDokument in mehreren Schritten aufbereitet. Mit Hilfe eines XML-Parsers wird das Dokument in eine interne Baumstruktur, Document Object Model (DOM), überführt. Diese wird wiederum von einem XSLT Prozessor weiterverarbeitet und eine Ausgabe (z.B. in HTML) erstellt. Das Apache XML Projekt: Cocoon und XSP 6 Als XML-Parser können der Apache Xerces (Standard) oder auch der Sun ProjectX eingesetzt werden. Als XSLT-Prozessoren sind Apache Xalan (Standard) oder James Clarks XT denkbar. James Taubers FOP kann zur PDF Erzeugung eingesetzt werden 2.1 Das Cocoon Web-Modell Cocoon verarbeitet Dokumente unter Trennung seiner Komponenten Inhalt (Text und Grafik), logischer Struktur (Gliederungen) und Darstellung (bspw. für Drucker oder Bildschirm). Dieses Cocoon Web Modell ermöglicht sozusagen eine „echte“ Rollenverteilung, wie sie z.B. auch in professionellen Redaktionssystem möglich ist. Abbildung 2: Das Cocoon Web-Modell. [6] Um eine echte Trennung von Logik und Inhalt zu erreichen, wurde im Rahmen von Cocoon die Extensible Server Pages (XSP) entwickelt. Dies bedeutet einen klaren Vorteil z.B. gegenüber HTML und JSP, wo eine Trennung der zwei Ebenen kaum möglich ist. Durch das Cocoon-Modell wird also die Entwicklung von Web-Inhalten in drei verschiedene Ebenen unterteilt: • XML Creation: Die XML-Datei wird vom Autor generiert. Er benötigt keinerlei Kenntnisse über die Weiterverarbeitung des Dokumentes. • XML Processing: In dieser Ebene wird die XML Datei weiterverarbeitet. Mittels XSP wird die Logik vom Inhalt getrennt. • XML Rendering: Das erzeugte Dokument wird mittels XSL Stylesheets aufbereitet und entsprechend der Anforderung formatiert (z.B. HTML, PDF, XML, WML, XHTML). Das Apache XML Projekt: Cocoon und XSP 7 2.2 Funktionsweise von Cocoon Abbildung 3: Verschiedene Prozessoren, die auf DOM-Daten arbeiten. [5] Cocoon bietet einen Rahmen, um in einer Verarbeitungskette verschiedene Prozessoren einzusetzen, ähnlich einer ‚Pipe‘ in UNIX-Shells (s. Abbildung 3). Über sogenannte Processing Instructions wird Cocoon mitgeteilt, welcher Prozessor im nächsten Schritt das Dokument oder besser den DOM Baum bearbeiten soll. Sind alle Processing Instructions abgearbeitet wird das Dokument an den Formatter weitergeschickt. In Abbildung 4 wird die Struktur von Cocoon noch einmal präziser dargestellt. Das Apache XML Projekt: Cocoon und XSP 8 Abbildung 4: Funktionsweise von Cocoon. [1] • Request Der Request enthält alle für die Verarbeitung der Anfrage wichtigen Informationen (welche URI, Typ des Browser, welcher Producer soll aktiviert werden). • Producer ein Producer bearbeitet den eingegangenen Request und liefert als Ergebnis ein XMLDokument, dessen Inhalt abhängig vom entsprechenden Producer ist. • Reactor Der Reactor bestimmt auf Basis von XML Processing Instructions, welcher Processor das XML-Dokument weiterverarbeiten soll. Nachdem die Verarbeitung abgelaufen ist, ist es die Aufgabe des Reactors, das überarbeitete Dokument an den vorgegebenen Formatter weiterzuleiten. • Formatter Ein Formatter formt das XML-Dokument in einen für Browser/Client verarbeitbaren Datenstrom um (MIME Typ setzen, ausführbarer Code). • Response Der Response fasst das erzeugte Dokumentes mit weiteren Eigenschaften wie Länge, MIME Typ usw. zusammen und schließt den Verarbeitungsprozess ab. • Loader Der Loader übergibt Dokumente mit zusätzlichen Processing Instructions an den Producer und gliedert diese wieder in die Verarbeitungskette ein. Ansonsten werden diese an die Response weitergeleitet. • Processor • XSLT-Prozessor: wendet XSLT-Transformationen auf das Eingabedokument an. Das Apache XML Projekt: Cocoon und XSP 9 • XSP-Prozessor: verarbeitet XSP-Seiten. • SQL-Prozessor: wickelt SQL-Datenbankabfragen mittels einfacher Tag-Sprache ab. Das zurückgegebene Resultset ist ein XML-Dokument. • LDAP-Prozessor: ermöglicht den Zugriff auf LDAP-Verzeichnisse. Liefert ein XML-Dokument zurück. 2.3 Cocoon Processing Instructions (PI) Der Reactor benötigt PI für die Auswahl des richtigen Processors oder Formatters. Dabei kennt Cocoon zwei Verarbeitungsdirektiven: Zum einen für die Auswahl des Processor: <?cocoon-process type="xxx"?> Andererseits für den Formatter: <?cocoon-format type="yyy"?> <?xml version="1.0"?> <?cocoon-process type="xslt"?> <?xml-stylesheet href="hello.xsl" type="text/xsl"?> <page> <title>Hello World!</title> <content> <paragraph>Meine erste Cocoon Seite!</paragraph> </content> Beispiel 1: Cocoon Processing Instruction für den XSLT-Prozessor. 2.4 Browser-abhängige Formatierung In den Stylesheet Anweisungen kann auch Pseudoattribut media definiert werden. Cocoon erkennt beim Aufruf über die HTTP-Zeile User-Agent den Browsertyp. Folgende vordefinierte Bezeichnungen für Browser/Client-Typen beispielsweise schon voreingestellt: explorer beliebiger Microsoft Internet Explorer (MSIE) opera Opera Browser lynx Lynx Browser java jede beliebige Java Klasse, die mittels URL zugreift sind in Cocoon Das Apache XML Projekt: Cocoon und XSP wap Nokia WAP Toolkit netscape jede beliebige Netscape Version (Mozilla) 10 <?xml version="1.0"?> <?cocoon-process type="xslt"?> <?xml-stylesheet href="hello.xsl" type="text/xsl"?> <?xml-stylesheet href="hello-lynx.xsl" type="text/xsl" media="lynx"?> ... Beispiel 2: Bei Lynx Browser wird ‚hello-lynx.xsl‘ als XSL-Datei verwendet. 2.5 Cocoon Cache System Die Performance und Speichernutzung sind bei der Verarbeitung kritische Momente. Sowohl das Parsen und Verarbeiten wie auch das Transformieren und Formatieren von XMLDokumenten ist sehr ressourcenintensiv. Deswegen wurde sehr auf eine effektive Cacheverwaltung bei der Entwicklung von Cocoon geachtet. Das Cachesystem kann statischen und dynamischen Inhalt speichern und beinhaltet auch eine Persistent Object Storage, d.h. ressourcenintensive Dokumente überleben die JVM. 2.6 Verwendete Technologien In diesem Kapitel werden kurz zwei Basistechnologien für Cocoon angerissen: XML und XSL. Die dritte grundlegende Technologie XSP wird im dritten Kapitel ausführlich behandelt. 2.6.1 XML Dies ist eine Syntax für hierarchische Dokumente und zum Strukturieren von Informationen bzw. Dokumenten geeignet. Im Rahmen dieser Arbeit wird nicht auf näher auf XML eingegangen. Das Apache XML Projekt: Cocoon und XSP 11 <?xml version="1.0"?> <?xml-stylesheet href="hello.xsl" type="text/xsl"?> <page> <title>Hello World!</title> <content> <paragraph>Meine erste Cocoon Seite!</paragraph> </content> </page> Beispiel 3: Ein XML-Dokument. 2.6.2 XSL XSL ist ein Sprache, also eine XML Document Type Definition (DTD), welche es ermöglicht XML-Dokumente in ein beliebiges Zielformat zu transformieren. Es können aber genauso die Elemente umstrukturiert oder verschiedene Sichten bzw. Layoutvarianten ermöglicht werden. So unterscheidet man zwischen XSLT, eine Sprache um XML in XML, HTML, XHTML, WAP usw. zu transformieren und XSL:FO (XSL:Formatting Objects), die 2D Layout von Text beschreibt. Dabei kann es sich um Printmedien wie z.B. einen Drucker als auch um Digitalmedien wie z.B. PDF’s handeln. XSL-Dateien werden über folgende Anweisung in die XML-Datei eingebunden: ... <?xml-stylesheet href="hello.xsl" type="text/xsl"?> ... ... <xsl:template match="page"> <html> <head> <title><xsl:value-of select="title"/></title> </head> <body bgcolor="#ffffff"> <xsl:apply-templates/> </body> </html> </xsl:template> ... Beispiel 4: Auszug aus der Datei ‚hello.xsl‘. Das Apache XML Projekt: Cocoon und XSP 12 3 eXtensible Server Pages (XSP) „Eine XSP Seite ist ein Cocoon XML Dokument, das auf Tags basierende Anweisungen enthält, die spezifizieren wie ein dynamischer Inhalt beim Aufrufzeitpunkt generiert werden soll.“ [1] Die Idee von XSP ist nicht neu innerhalb von Seiten Programm-Code unterzubringen (s. PHP, JSP). XSP wurde - wie schon häufiger erwähnt - im Rahmen von Cocoon entwickelt, um die Trennung von Logik und Inhalt zu ermöglichen. XSP‘s sind XML-Dokumente und somit wohlgeformte XML-Dokumente, aber nicht unbedingt gültige. Als Beispiel für eine XSP-Datei dient ein kleines Programm, das anhand der Uhrzeit erkennt, ob es beim Aufruf ‚Guten Morgen‘ oder ‚Guten Tag‘ ausgeben soll. Die wichtigsten XSPTags sind in den folgenden Beispielen blau markiert. <?xml version="1.0"?> <?cocoon-process type="xsp"?> <?xml-stylesheet href="sample.xsl" type="text/xsl"?> <xsp:page language="java" xmlns:xsp="http://www.apache.org/1999/XSP/Core"> <xsp:structure> <xsp:include>java.text.SimpleDateFormat</xsp:include> </xsp:structure> ... <p>Guten <xsp:logic> String timeOfDay = (new SimpleDateFormat("aa“)).format(new Date()); if (timeOfDay.equals("AM")) { <xsp:content>Morgen</xsp:content> } else { <xsp:content>Tag</xsp:content> } </xsp:logic> </p> ... </xsp:page> Beispiel 5: XSP-Logik zum Auswerten der Tageszeit im Rahmen einer XML-Datei. Das Apache XML Projekt: Cocoon und XSP 13 3.1 Wichtige XSP-Tags 3.1.1 <xsp:page> Das Wurzelelement einer XSP-Instanz ist immer <xsp:page>. Mit dem Attribut language wird die Programmiersprache festgelegt. Zur Zeit ist Java der Standard und die einzige Möglichkeit, es soll aber in Zukunft jede Programmiersprache unterstützt werden. Zusätzlich wird im Wurzelelement der eindeutige Namensraum definiert, es können aber auch weitere Namensraumangaben ergänzt werden. <?xml version="1.0"?> <?cocoon-process type="xsp"?> <?cocoon-process type="xslt"?> <?xml-stylesheet href="sample.xsl" type="text/xsl"?> <xsp:page language="java" xmlns:xsp="http://www.apache.org/1999/XSP/Core"> ... </xsp:page> Beispiel 6: Wurzelelement <xsp:page>. 3.1.2 <xsp:structure> und <xsp:include> <xsp:structure> nimmt Elemente vom Typ <xsp:include> auf, die dazu dienen in einer sprachunabhängigen Weise, Sprachbibliotheken zu laden. Einige wichtige Java Pakete werden automatisch geladen. <xsp:page language="java" mlns:xsp="http://www.apache.org/1999/XSP/Core"> <xsp:structure> <xsp:include>java.text.SimpleDateFormat</xsp:include> </xsp:structure> ... </xsp:page> Beispiel 7: <xsp:structure> und <xsp:logic> Das Apache XML Projekt: Cocoon und XSP 3.1.3 14 <xsp:logic> und <xsp:content> Im Bereich von <xsp:logic> wird der eigentliche Programmiercode der XSP-Seite eingefügt. Dieser Inhalt wird später in ausführbaren Code umgewandelt. PI‘s der obersten Ebene bleiben bei der Verarbeitung durch den XSP-Prozessor erhalten. Beliebige JavaKonstrukte sind einfügbar, so sind auch SQL-Abfragen möglich. Der Tag <xsp:content> bettet Inhalt in <xsp:logic> ein. <xsp:page language="java" xmlns:xsp="http://www.apache.org/1999/XSP/Core"> ... <xsp:logic> String timeOfDay = (new SimpleDateFormat("aa“)).format(new Date()); if (timeOfDay.equals("AM")) { <xsp:content>Morgen</xsp:content> } else { <xsp:content>Tag</xsp:content> } </xsp:logic> ... </xsp:page> Beispiel 8: <xsp:logic> und <xsp:content>. 3.1.4 <xsp:expr> Über das <xsp:expr>-Tag kann der Entwickler Expressions, also Ausdrücke in das Zieldokument einfügen. Der Wert des enthaltenen Ausdrucks wird berechnet und als TextKnoten in das resultierende Dokument eingefügt (bzw. in die DOM-Struktur). <xsp:page language="java" xmlns:xsp="http://www.apache.org/1999/XSP/Core"> ... <xsp:logic> int value = 3 + 4; String text = "Ergebnis = “ + value; </xsp:logic> <xsp:expr>text</xsp:expr> ... </xsp:page> Beispiel 9: <xsp:expr>. Das Apache XML Projekt: Cocoon und XSP 15 3.2 XSP-Bibliotheken Mittels Tag-Bibliotheken lässt sich die Anwendungslogik vor dem Inhaltshersteller verstecken. Für den Autor genügt es zu wissen, welche Tags es gibt und mit welchen Attributen ihr Verhalten gesteuert wird.Tag-Bibliotheken können Java-Klassen oder auch XSL-Stylesheets sein. Eingebunden werden die Tag-Bibliotheken über Namensraumdeklaration im <xsp:page> -Element. Mittlerweile existieren eine Reihe von Taglibs, die auch standardmäßig mitgeliefert werden. So gibt es beispielsweise eine SQL<?xml version="1.0"?> <?cocoon-process type="xsp"?> <?cocoon-process type="xslt"?> <?xml-stylesheet href="sample.xsl" type="text/xsl"?> <xsp:page language="java" xmlns:xsp="http://www.apache.org/1999/XSP/Core" xmlns:example="http://www.plenix.com/DTD/XSP/Example"> <page title="Time of Day"> <p> To the best of my knowledge, it's now <example:time-of-day format="yy/MM/dd hh:mm:ss aa"/> </p> .. </page> </xsp:page> Beispiel 10: Hier wird mittels der Namensraumangabe ‚example‘ eine XSP-Taglib eingebunden. Taglib für Datenbankabfragen oder eine PF-Taglib zum einfacheren Formatieren von HTMLFormularen. Interessanter ist auf jeden Fall die Möglichkeit diese Taglibs auszubauen oder einfach neue selbst zu definieren. 3.3 Beispiel für Trennung von Logik und Inhalt Im folgenden soll anhand eines simplen Beispiels die Trennung von Logik und Inhalt verdeutlicht werden. Die Quellcodes zu den einzelnen genannten Dateien sind im Anhang aufgelistet. Es sollen Notizen verarbeitet werden, die aus einem Titel, einem Autor, einem Datum sowie einem oder mehreren Absätzen bestehen. Innerhalb der Absätze können Textstellen als wichtig markiert werden. Dynamisch soll bei der Anzeige des Dokumentes Das Apache XML Projekt: Cocoon und XSP 16 (mittels XSLT nach HTML) die noch verbleibenden Tage bis zu dem angegebenen Datum berechnet werden. Der Autor bindet mittels einer PI ein Stylesheet in das erstellte Dokument ‚notiz.xml‘ ein. Über diese PI wird der XSLT-Prozessor aufgerufen und das Stylesheet ‚notiz-xsp.xsl‘ generiert aus der Notiz eine XSP-Datei, mit der vorgeschriebenen Wurzel <xsp:page>. Eingebettet in die Wurzel befindet sich die Programmierlogik. Normalerweise taucht die XSP-Datei ‚notiz.xsp‘ nicht auf, außer sie wird explizit erzeugt. Zwei neu eingefügte PI‘s teilen Cocoon mit, wie das Dokument weiter bearbeitet werden soll. Als nächstes wird die Programmierlogik ausgewertet und mittels der XSL-Datei ‚notiz2html.xsl‘ zu einem HTML-Dokument formatiert. In Abbildung 5 sind schematisch die einzelnen Verarbeitungsschritte nochmals aufgezeigt. Abbildung 5: Schematische Übersicht über die einzelnen Verarbeitungsschritte. Das Apache XML Projekt: Cocoon und XSP 17 4 Ausblick Es konnte im Rahmen dieser Arbeit nur ein kleiner Ausschnitt der Leistungsfähigkeit von Cocoon 1.8 vorgestellt werden. Cocoon besitzt viele Stärken, wie die leichte Portierbarkeit durch eine Implementierung in Java, die Verwendung von W3C-Standards oder die Trennung von Inhalt, Logik und Darstellung. Einzige Voraussetzung ist eine Servlet Engine der 2. Generation, um es auf zahlreichen Servern zum Laufen zu bringen. Cocoon besitzt aber auch Schwächen. Denn als mit der Entwicklung von Cocoon begonnen wurde, waren viele heutige Standards noch in der Entwurfsphase und es war nicht abzusehen, in welche Richtung die Entwicklung gehen wird. So ergeben sich viele Restriktionen in Cocoon 1.x, aber auch Schwächen bei Speicherplatzbedarf und Laufzeit. Deshalb hat man mit einem zweiten Entwicklungszweig (Cocoon 2) begonnen. Dabei sollen Fehler und Restriktionen eliminiert und der Speicherbedarf verringert werden, als auch eine erhöhte Geschwindigkeit und Modularität erzielt werden. Es müssen durch eine Umstellung von DOM-basierte auf Eventbasierte (SAX-Parser) Verarbeitung von XML-Dokumenten auch keine kompletten Dokumente mehr weitergereicht werden. Das wichtigste Ziel bleibt aber weiterhin die Vereinfachung und Technik des WebsiteManagements durch eine Verringerung der Anzahl an „contracts“ (siehe Abbildung 5). So wird in Cocoon 2, das sich derzeit im Alphastadium (alpha 3) befindet, eine Sitemap eingeführt. Der Ablauf von Verarbeitungsschritten muss also nicht mehr in die Verarbeitungsschritte hineincodiert werden. Abbildung 6: Cocoon versucht die Anzahl an ‚contracts‘ (schwarze Verbindungslinien) zu verringern. [1] Diese Neuerungen sind vielversprechend und Cocoon wird sicherlich in Zukunft immer mehr eine Alternative zu JSP und HTML darstellen. Das Apache XML Projekt: Cocoon und XSP 18 Anhang notiz.xml <?xml version="1.0" encoding="ISO-8859-1"?> <?cocoon-process type="xslt"?> <?xml-stylesheet href="notiz-xsp.xsl" type="text/xsl"?> <notiz> <titel>Termine</titel> <autor>Weihnachtsmann</autor> <datum>24.12.2001</datum> <absatz>Nicht vergessen: <wichtig>Geschenke austeilen</wichtig> </absatz> <absatz> ... </absatz> </notiz> notiz-xsp.xsl <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsp="http://www.apache.org/1999/XSP/Core"> <!-- ================================================ --> <!-- Default-Template: Kopieren der Elemente --> <xsl:template match="*|@*|comment()|text()"> <xsl:copy> <xsl:apply-templates select="*|@*|comment()|text()"/> </xsl:copy> </xsl:template> <!-- ================================================ --> <!-- Template fuer 'datum': Einfuegen von XSP-Logic --> <xsl:template match="datum"> <datum> <xsl:value-of select="text()"/> </datum> <restzeit> <xsp:logic> Date jetzt = new Date(); DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMANY); String terminS = "<xsl:value-of select="text()"/>"; Date termin = new Date(); termin = df.parse(terminS); long tage = (termin.getTime() - jetzt.getTime())/1000/60/60/24; </xsp:logic> <xsp:expr>tage</xsp:expr> <xsl:text> Tagen</xsl:text> </restzeit> </xsl:template> Das Apache XML Projekt: Cocoon und XSP <!-- ================================================ --> <!-- Template fuer Root-Element 'notiz' --> <xsl:template match="notiz"> <!-- Ausgeben der PIs fuer weitere Verarbeitung: Erst XSP, dann XSLT --> <xsl:processing-instruction name="cocoon-process">type="xsp" </xsl:processing-instruction> <xsl:processing-instruction name="cocoon-process">type="xslt" </xsl:processing-instruction> <xsl:processing-instruction name="xml-stylesheet"> href="notiz2html.xsl" type="text/xsl"</xsl:processing-instruction> <!-- Ausgeben des neuen Root-Elements 'xsp:page' --> <xsp:page language="java" xmlns:xsp="http://www.apache.org/1999/XSP/Core"> <!-- Laden der benoetigten Java-Bibliotheken --> <xsp:structure> <xsp:include>java.util.Date</xsp:include> <xsp:include>java.text.DateFormat</xsp:include> </xsp:structure> <!-- Element 'notiz', dass nach der XSP-Verarbeitung erzeugt wird--> <notiz> <xsl:apply-templates/> </notiz> </xsp:page> </xsl:template> </xsl:stylesheet> notiz.xsp <?xml version="1.0" encoding="ISO-8859-1"?> <?cocoon-process type="xsp"?> <?cocoon-process type="xslt"> <?xml-stylesheet href="notiz2html.xsl" type="text/xsl"?> <xsp:page language="java" xlmns="http://www.apache.org/1999/XSP/Core"> <xsp:structure> <xsp:include>java.util.Date</xsp:include> <xsp:include>java.text.DateFormat</xsp:include> </xsp:structure> <notiz> <titel>Termine</titel> <autor>Weihnachtsmann</autor> <datum>24.12.2001</datum> <restzeit> <xsp:logic> Date jetzt = new Date(); DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMANY); String terminS ="24.12.2001"; Date termin = new date(); termin = df.parse(terminS); long tage = (termin.getTime() - jetzt.getTime()) / 1000 / 60 / 60 / 24; </xsp:logic> <xsp:expr>tage</xsp:expr> Tagen </restzeit> <absatz>Nicht vergessen: <wichtig>Geschenke austeilen</wichtig> </absatz> <absatz> ... </absatz> </notiz> </xsp:page> 19 Das Apache XML Projekt: Cocoon und XSP notiz2html.xsl <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- ================================== --> <!-- Template fuer Root-Element 'notiz' --> <xsl:template match="notiz"> <xsl:processing-instruction name="cocoon-format"> type="text/html" </xsl:processing-instruction> <html> <head><title>Notiz</title></head> <body> <p align="center"><table> <xsl:apply-templates/> </table> </p> </body> </html> </xsl:template> <!-- ================================== --> <!-- Template fuer Elementtyp 'titel' --> <xsl:template match="titel"> <tr> <th colspan="2"> <xsl:apply-templates/> </th> </tr> </xsl:template> <!-- ================================== --> <!-- Template fuer Elementtyp 'autor' --> <xsl:template match="autor"> <tr> <td align="right">von</td> <td> <xsl:apply-templates/> </td> </tr> </xsl:template> <!-- ================================== --> <!-- Template fuer Elementtyp 'datum' --> <xsl:template match="datum"> <tr> <td align="right">für den</td> <td> <xsl:apply-templates/> </td> </tr> </xsl:template> <!-- ===================================== --> <!-- Template fuer Elementtyp 'restzeit' --> <xsl:template match="restzeit"> <tr> <td align="right">in</td> <td> <xsl:apply-templates/> </td> 20 Das Apache XML Projekt: Cocoon und XSP </tr> </xsl:template> <!-- =================================== --> <!-- Template fuer Elementtyp 'absatz' --> <xsl:template match="absatz"> <tr> <td align="right"></td> <td> <p><xsl:apply-templates/></p> </td> </tr> </xsl:template> <!-- ==================================== --> <!-- Template fuer Elementtyp 'wichtig' --> <xsl:template match="wichtig"> <b><xsl:apply-templates/></b> </xsl:template> </xsl:stylesheet> 21 Das Apache XML Projekt: Cocoon und XSP 22 Bibliographie [1] Apache XML Project: http://xml.apache.org/. [2] Behme, Henning; Mintert, Stefan: ‚XML in der Praxis.‘, Addison-Wesley, 2000². [3] Dumbill, Edd: ‚Apache XML Project Launches.‘, http://www.xml.com/pub/a/1999/11/apache/index.html. [4] McLaughlin, Brett: ‚Java and XML.‘, O’Reilly, 2000. [5] Mintert, Stefan; Menge, Rainald: ‚XML verpuppt. Aufbereitung mit Cocoon und Extensible Server Pages.‘, c’t 10/00, S. 222-227. [6] Reichel, Volker: ‚X auf dem Server. Cocoon eine Alternative zu Java Server Pages?‘, Java Magazin 08/2000, S. 91-99. [7] Reichel, Volker: ‚Eingesponnen. Webpublishing mit Cocoon 1.8: XSP-Dokumente und andere Komponenten.‘, Der Entwickler 1/2001, S. 91-97.