Java and XSLT Schlagwortsuche Suche Bücher A-Z Suchen Eine Einführung in XML Neuerscheinungen Buchreihen von Brett McLaughlin Programmbereiche C/C++ Programmierung Design & Grafik Inhalt: Java Linux Macintosh .Net Open Source Was ist das eigentlich? Wie benutze ich das? Warum sollte ich XML verwenden? Dieser Text ist das einleitende Kapitel aus Java und XML, in aktualisierter und leicht gekürzter Form. Wir stellen den Text hier zur Verfügung, da er sehr praxisnah in XML einführt und in dieser Form in der zweiten Auflage von Java and XML, deren Übersetzung in Arbeit ist, nicht mehr enthalten sein wird (Brett McLaughlin verzichtet in der neuen Auflage zugunsten fortgeschrittenerer Themen auf eine ausführlichere Einführung in XML). Oracle Perl Python Sicherheit System- & Netzwerkadministration Unix Visual Basic Web & Internet Windows XML Weitere Infos Katalog bestellen Mailinglisten abonnieren Archiv XML. Diese drei Buchstaben haben so ziemlich jeden Entwickler auf der ganzen Welt irgendwann in den letzten zwei Jahren erschauern lassen. Auch wenn diese Schauer oft aus Angst, sich noch ein Kürzel merken zu müssen, gespannter Erwartung auf eine neue Technologie oder aus Verärgerung darüber, daß noch eine weitere Quelle der Verwirrung für heutige Entwickler hinzukommt, entstanden sind, waren es doch allesamt Schauer. Erstaunlicherweise war jede dieser Reaktionen auf XML gerechtfertigt. XML ist ein weiteres Kürzel, das man sich merken muß, und besitzt auch noch eine schwindlig machende Reihe von Kollegen: XSL, XSLT, PI, DTD, XHTML und weitere. Es enthält auch ein gewaltiges Versprechen: Was Java für die Portabilität von Code geleistet hat, das verspricht XML für die Portabilität von Daten. Sun hat in den letzten Monaten sogar den ziemlich ehrgeizigen Slogan "Java + XML = portabler Code + portable Daten" geprägt. Und ja, XML führt zu einer nicht zu vernachlässigenden Verwirrung. Wir werden uns hier aufmachen, XML zu entmystifizieren - ohne so abstrakt und allgemein zu bleiben, daß der Nutzen verlorengeht, und ohne so tief einzusteigen, daß dieser Text nur eine weitere langweilige Spezifikation wird, die man durchackern muß. Diese Einführung ist für Sie, den Java-Entwickler, geschrieben, der die Aufregung verstehen und die Werkzeuge verwenden will, die XML so mitbringt. Heutige Web-Applikationen müssen sich mit Problemen herumschlagen, über die vor zehn Jahren noch niemand nachgedacht hat. Systeme, die über Tausende von Kilometern verteilt sind, müssen schnell und fehlerlos zusammenarbeiten. Daten aus heterogenen Systemen, Datenbanken, Verzeichnisdiensten und Anwendungen müssen untereinander übertragen werden, ohne daß dabei auch nur eine einzige Nachkommastelle verlorengeht. Applikationen müssen nicht nur mit anderen Geschäftskomponenten kommunizieren können, sondern auch mit anderen Firmen und anderen Technologien. Clients sind nicht mehr nur Thick Clients, sondern können auch Web-Browser, die HTML unterstützen, Mobiltelefone, die das Wireless Application Protocol (WAP) unterstützen, oder Taschen-Organizer mit ganz anderen Formatierungssprachen sein. Daten und deren Umformung und Konvertierung sind zum kritischen Herzstück jeder heutzutage entwikkelten Applikation geworden. XML ermöglicht es Programmierern, alle diese Anforderungen zu erfüllen. Außerdem steht speziell Java-Entwicklern ein ganzes Arsenal von APIs zur Verfügung, mit denen sie XML und http://www.oreilly.de/artikel/xml_einf.html (1 of 20) [6/10/2002 2:14:00 PM] Java and XSLT dessen Freundeskreis verwenden können, ohne jemals eine Integrierte JavaEntwicklungsumgebung (IDE) verlassen zu müssen. Wir werden XML immer als Werkzeug, nicht als Schlagwort oder als das neueste Spielzeug behandeln. Behalten wir das im Hinterkopf, und fangen wir an, darüber zu reden, was XML eigentlich ist. Was ist das eigentlich? XML ist die Extensible Markup Language. Wie ihr Vorgänger SGML ist auch XML eine MetaSprache, mit der andere Sprachen definiert werden. XML ist aber viel einfacher und weniger umständlich als SGML. XML ist eine Markup-Sprache, die weder die zur Verfügung stehenden Tags noch die Grammatik der Zielsprache spezifiziert. Die Tag-Menge einer Markup-Sprache definiert die Markup-Tags, die der Parser der Sprache versteht. Beispielsweise gibt es in HTML eine genau festgelegte Menge von Tags. Sie können den Tag <TABLE>, aber nicht den Tag <CHAIR> verwenden. Der erste Tag hat eine festgelegte Bedeutung für eine Applikation, die die Daten verwendet, und wird dazu benutzt, den Anfang einer Tabelle in HTML anzuzeigen. Der zweite Tag dagegen hat keine spezielle Bedeutung. Die meisten Browser werden ihn zwar einfach ignorieren, aber es können auch unerwartete Dinge passieren, wenn dieser Tag verwendet wird. Das liegt daran, daß die Tag-Menge von HTML ein Bestandteil der Sprachdefinition ist. In jeder neuen HTML-Version werden neue Tags definiert. Wenn ein Tag aber nicht definiert ist, dann kann er auch nicht als Bestandteil der Markup-Sprache benutzt werden, ohne daß beim Parsen des Dokuments ein Fehler gemeldet wird. Die Grammatik einer Markup-Sprache definiert die korrekte Verwendung der Tags der Sprache. Lassen Sie uns auch hier wieder HTML als Beispiel verwenden. Bei Verwendung des <TABLE>-Tags kann eine Reihe von Attributen angegeben werden, etwa die Breite, die Hintergrundfarbe und die Ausrichtung. Sie können aber nicht den Typ der Tabelle angegeben, weil die Grammatik von HTML das nicht zuläßt. Dadurch, daß XML weder die Tags noch die Grammatik definiert, ist die Sprache beliebig erweiterbar, daher auch ihr Name. Wenn Sie gern den Tag <TABLE> verwenden und darin mehrere <CHAIR>-Tags verschachteln möchten, dann können Sie das tun. Wenn Sie ein TYPEAttribut für den Tag <CHAIR> definieren möchten, dann können Sie das ebenfalls tun. Wenn Sie das möchten, dann können Sie Ihre Tags auch nach Ihren Kindern oder Ihren Kollegen benennen. Um das zu demonstrieren, werfen Sie am besten einmal einen Blick auf die in Beispiel 1 gezeigte XML-Datei. Beispiel 1: Ein Beispiel für eine XML-Datei <?xml version="1.0"?> <dining-room> <table type="round" wood="maple"> <manufacturer>Das Holzlädchen</manufacturer> <price>$1999.99</price> </table> <chair wood="maple"> <quantity>2</quantity> <quality>ausgezeichnet</quality> <cushion included="true"> <color>blau</color> </cushion> </chair> <chair wood="oak"> <quantity>3</quantity> <quality>durchschnittlich</quality> </chair> </dining-room> http://www.oreilly.de/artikel/xml_einf.html (2 of 20) [6/10/2002 2:14:00 PM] Java and XSLT Wenn Sie noch nie eine XML-Datei gesehen haben, sich aber mit HTML oder einer anderen Markup-Sprache auskennen, dann wird Ihnen das vielleicht ein wenig komisch vorkommen. Das liegt daran, daß die verwendeten Tags und die verwendete Grammatik frei erfunden sind. Keine Webseite und keine Spezifikation definiert die Tags <table>, <chair> und <cushion> (obwohl das möglich wäre, genauso wie die XHTML-Spezifikation HTML-Tags in XML definiert); sie sind vollständig aus der Luft gegriffen. Das ist die große Stärke von XML: Sie können damit den Inhalt Ihrer Daten beliebig definieren, solange Sie sich an die allgemeine Struktur halten, die von XML vorgeschrieben wird. Wir werden später noch detailliert auf einige andere Einschränkungen eingehen, aber im Moment reicht es, wenn Sie sich klarmachen, daß XML geschaffen wurde, um die größtmögliche Flexibilität beim Formatieren von Daten zu erhalten. Obwohl diese Flexibilität eine der größten Stärken von XML ist, ist sie auch eine der größten Schwächen: Weil XML-Dokumente auf so viele verschiedene Arten und Weisen und zu so vielen verschiedenen Zwecken verarbeitet werden können, gibt es eine große Anzahl von XMLbezogenen Standards, die die Übersetzung und die Spezifikation von Daten beschreiben. Diese zusätzlichen Kürzel und ihre stetige Gemeinschaft mit XML führen oft zu Verwirrung darüber, was XML eigentlich ist und was nicht. Oftmals meint jemand, der von "XML" spricht, nicht die Extensible Markup Language selbst, sondern alle oder einige XML-Werkzeuge. Auch wenn diese manchmal gesondert erwähnt werden, sollten Sie immer im Hinterkopf behalten, daß "XML" nicht einfach XML bedeutet; meistens ist damit "XML und all die tollen Möglichkeiten, es zu verarbeiten und zu benutzen" gemeint. Mit diesen Vorbemerkungen können wir jetzt einige der wichtigsten XML-Kürzel definieren und für jedes davon eine kurze Beschreibung liefern. Mit diesen Beschreibungen sollten Sie eine anfängliche Vorstellung davon erhalten, wie die einzelnen XML-Werkzeuge zusammenpassen und was XML ist und was nicht. Wir vermeiden hier die Diskussion von Publishing Engines, Applikationen und Werkzeugen für XML. Statt dessen behandeln wir in diesem Überblick nur die diversen Spezifikationen und Empfehlungen in ihren unterschiedlichen Stadien der Beschlußfassung. Die meisten davon sind Initiativen des W3C, des World Wide Web Consortium. Diese Gruppe definiert Standards für die XMLGemeinde, mit denen eine gemeinsame Wissensbasis für diese Technologie aufgebaut werden kann, ähnlich wie Sun Standards für Java und die zugehörigen APIs liefert. Nähere Informationen zum W3C finden Sie unter http://www.w3.org. XML XML ist natürlich die Mutter all dieser drei- und vierbuchstabigen Abkürzungen. Es definiert die Kernsprache selbst und liefert ein metadatenartiges Framework. XML für sich genommen hat nur einen sehr eingeschränkten Nutzen; es definiert nur dieses Framework. Aber all die diversen Technologien, die auf XML aufbauen, liefern Entwicklern und Autoren von Inhalten eine noch nicht dagewesene Flexibilität bei der Verwaltung und Übertragung von Daten. XML ist derzeit eine vollständige W3C-Empfehlung, wird sich also nicht mehr ändern, bis eine neue Version veröffentlicht wird. Die vollständige XML 1.0-Spezifikation finden Sie unter http://www.w3.org/XML/. Diese Spezifikation ist selbst für XML-Experten mühsam zu lesen; eine sehr gute Version dieser Spezifikation mit Randbemerkungen finden Sie jedoch unter http://www.xml.com. Für unsere Erläuterungen müssen Sie nur zwei grundlegende Konzepte im Zusammenhang mit XML-Dokumenten verstehen. Das erste besagt, daß jedes XML-Dokument wohlgeformt (wellformed) sein muß, um überhaupt irgendeinen Nutzen zu haben und korrekt geparst werden zu können. Ein wohlgeformtes Dokument ist ein Dokument, bei dem jeder geöffnete Tag auch wieder geschlossen wird, bei dem die Verschachtelungsreihenfolge nicht durchbrochen wird und das hinsichtlich der Spezifikation syntaktisch korrekt ist. Sie fragen sich jetzt vielleicht, ob wir nicht ein paar Absätze weiter oben gerade behauptet haben, daß XML keine Syntaxregeln habe. Das stimmt jedoch nicht ganz; wir haben dort gesagt, daß es keine grammatikalischen Regeln hat. Das Dokument kann zwar eigene Tags und Attribute definieren, muß aber trotzdem noch den allgemeinen Regeln und Prinzipien folgen. Diese Prinzipien werden dann von XML-fähigen http://www.oreilly.de/artikel/xml_einf.html (3 of 20) [6/10/2002 2:14:00 PM] Java and XSLT Applikationen und Parsern benutzt, um das Dokument zu verstehen und irgendwelche Aktionen auf den Daten auszuführen, wie z.B. den Preis für einen Stuhl zu suchen oder eine PDF-Datei aus den Daten im Dokument zu erzeugen. Das zweite grundlegende Konzept hinsichtlich XML-Dokumenten besagt, daß sie gültig (valid) sein können, es aber nicht sein müssen. Ein gültiges Dokument ist ein Dokument, das seiner Document Type Definition (DTD) gehorcht, auf die wir gleich eingehen werden. Vereinfacht gesagt definiert eine DTD die Grammatik und Tag-Menge für eine bestimmte XMLFormatierung. Wenn ein Dokument eine DTD spezifiziert und den darin festgelegten Regeln dann auch folgt, dann ist dieses Dokument ein gültiges XML-Dokument. XML-Dokumente können auch durch ein Schema in ihrer Freiheit eingeschränkt werden: eine neue Möglichkeit, XML-Formate vorzuschreiben, die DTDs ersetzen wird. Machen Sie sich keine Sorgen, wenn das alles noch etwas verwirrend ist; wir haben noch einen weiten Weg vor uns und werden uns alle diese Spezifikationen aus der XML-Welt noch etwas genauer ansehen. Zunächst gibt es aber einige Kürzel und Spezifikationen, die in einem XML-Dokument verwendet werden. Diese schauen wir uns als nächstes an. PI Eine PI in einem XML-Dokument ist eine Verarbeitungsanweisung (processing instruction). Eine Verarbeitungsanweisung teilt einer Applikation mit, eine bestimmte Aufgabe durchzuführen. PIs sind zwar nur ein kleiner Bestandteil der XML-Spezifikation, aber gleichwohl wichtig genug, um einen eigenen Abschnitt in unserer Behandlung der XML-Kürzel verdient zu haben. Eine PI unterscheidet sich von anderen XML-Dateien, weil sie einen Befehl an entweder den XML-Parser oder ein Programm repräsentiert, das das XML-Dokument verwendet. In unserem Beispieldokument in Beispiel 1 ist die erste Zeile, die die XML-Version angibt, eine Verarbeitungsanweisung. Sie teilt dem Parser mit, welche XML-Version verwendet wird. Verarbeitungsanweisungen haben die Form <?ziel anweisungen?>. Alle PIs mit dem Ziel XML sind ein Bestandteil der Standardmenge von PIs, die alle Parser verstehen sollten, und werden oft XML-Anweisungen genannt, aber PIs können auch Informationen angeben, die von Applikationen, die den Parser nur benutzen, verwendet werden. In solchen Fällen könnte der Applikation ein Schlüsselwort (wie etwa "cocoon") zugeordnet werden, das dann als Ziel der PI benutzt werden kann. Verarbeitungsanweisungen werden extrem wichtig, wenn XML-Daten in XML-fähigen Applikationen benutzt werden. Um ein etwas aussagekräftigeres Beispiel zu geben: Denken Sie sich eine Applikation, die unsere Beispiel-XML-Datei verarbeitet und daraus auf der Basis des Lagerbestands und der Informationen im XML-Dokument einen Werbeprospekt für einen Möbelladen generiert. Eine Verarbeitungsanweisung könnte die Applikation wissen lassen, daß manche Möbel auf einer "Gesucht"-Liste stehen und an eine andere Applikation weitergeleitet werden müssen, beispielsweise eine Applikation, die Bestellungen abarbeitet. Solche Möbel sollten natürlich nicht im Werbeprospekt auftauchen. Ein XML-Parser erkennt die PIs mit externen Zielen und leitet diese unverändert an die externe Applikation weiter. DTD Eine DTD ist eine Dokumenttyp-Definition (document type definition). Eine DTD legt eine Reihe von Einschränkungen für ein XML-Dokument (oder eine Reihe von Dokumenten) fest. Die DTD für sich genommen ist keine Spezifikation, sondern als ein Bestandteil der XMLSpezifikation definiert. In einem XML-Dokument kann eine Dokumenttyp-Definition sowohl Markup-Beschränkungen enthalten als auch auf ein externes Dokument mit solchen Beschränkungen verweisen. Die Summe dieser beiden Mengen von Beschränkungen bildet die Dokumenttyp-Definition. Eine DTD definiert, wie ein XML-Dokument aufgebaut werden muß. Schauen Sie sich noch einmal das XML-Dokument in Beispiel 1 an. Wir konnten zwar unsere eigenen Tags verwenden, aber dieses Dokument ist für eine andere Applikation oder sogar für einen anderen Menschen nutzlos, wenn diese nicht verstehen, was unsere Tags bedeuten. Obwohl man sich mit ein wenig gesundem Menschenverstand denken kann, was die meisten Tags bedeuten, gibt es doch noch Mehrdeutigkeiten. Besagt der Tag <quantity>, wie viele http://www.oreilly.de/artikel/xml_einf.html (4 of 20) [6/10/2002 2:14:00 PM] Java and XSLT Stühle noch am Lager sind? Kann ein wood-Attribut in einem <chair>-Tag angegeben werden? Diese Fragen müssen für ein XML-Dokument beantwortet werden, damit es von einem XML-Parser ordnungsgemäß überprüft ("validiert") werden kann. Ein Dokument gilt als gültig, wenn es den Einschränkungen gehorcht, die die DTD für die Formatierung der XML-Daten auferlegt. Das ist besonders wichtig, wenn Daten zwischen Applikationen übertragen werden sollen, weil es dann eine Übereinkunft geben muß, wie die Daten formatiert sind, und welche Syntax gelten soll, damit sich die Systeme verstehen können. Sie werden sich erinnern, daß wir weiter oben geschrieben haben, daß eine DTD die Einschränkungen für ein bestimmtes XML-Dokument oder eine Reihe von Dokumenten festlegt. Ein Entwickler oder Autor schreibt auch diese DTD als zusätzliches Dokument, das in seinen XML-Dateien referenziert wird, oder setzt es in die XML-Datei ein. Die DTD ist das, was den XML-Daten ihre Portabilität ermöglicht. Beispielsweise könnte sie definieren, daß für das Attribut wood nur "ahorn", "kiefer", "eiche" und "mahagoni" zulässige Werte sind. Damit kann der Parser feststellen, ob der Inhalt eines Dokuments akzeptabel ist, und so Datenfehler verhindern. Eine DTD definiert auch, inwieweit das Verschachteln von Tags erlaubt ist. Beispielsweise könnte sie vorschreiben, daß der Tag <cushion> nur eingeschachtelt im Tag <chair> vorkommen darf. Auf diese Art und Weise kann eine andere Applikation, die unsere Beispiel-XML-Datei bekommt, wissen, wie sie die Datei verarbeiten und wie sie darin suchen soll. Die DTD ist der Puzzlestein, der der Erweiterbarkeit eines XML-Dokuments Portabilität hinzufügt, was nicht nur zu flexiblen Daten führt, sondern auch zu Daten, die von jedem Rechner verarbeitet und validiert werden können, der Zugriff auf die DTD des Dokuments hat. Namensräume Das Konzept der Namensräume ist eines der wenigen Konzepte aus dem XML-Bereich, aus dem kein Kürzel gemacht worden ist. Es hat sogar einen Namen, der den Zweck erahnen läßt! Ein Namensraum ist eine Verknüpfung zwischen einem Element-Präfix und einem URI. Diese Verknüpfung wird zur Auflösung von Namensraum-Kollisionen und zum Definieren von Datenstrukturen verwendet, die dem Parser den Umgang mit Kollisionen ermöglichen. Als ein Beispiel für eine mögliche Namensraum-Kollision stellen Sie sich bitte ein XML-Dokument vor, in dem es ein <price>-Tag für einen Stuhl gibt, das zwischen <chair> und </chair> stehen muß. Die Definition eines Stuhles enthält aber auch einen <cushion>-Tag, der auch wiederum einen <price>-Tag haben kann. Bedenken Sie auch, daß das Dokument ein anderes XML-Dokument referenzieren kann, das etwa Copyright-Informationen enthält. Beide Dokumente enthalten dann möglicherweise <date>- oder <company>-Tags. Solcherart in Konflikt stehende Tags führen zu einer Mehrdeutigkeit, welcher Tag eigentlich was bedeutet. Diese Mehrdeutigkeit ist für einen XML-Parser ein ernsthaftes Problem. Soll der <price>-Tag je nach dem Element, in dem er enthalten ist, unterschiedlich interpretiert werden? Oder hat der Autor hier einen Fehler gemacht, den Tag in zwei unterschiedlichen Kontexten zu verwenden? Ohne zusätzliche Namensraum-Informationen ist es nicht möglich zu entscheiden, ob hier ein Fehler im Aufbau des XML-Dokuments vorliegt, oder, falls das nicht der Fall ist, wie die Daten in den miteinander in Konflikt stehenden Tags interpretiert werden sollen. Die XML-Namensraum-Empfehlung definiert einen Mechanismus, um diese Namen zu qualifizieren. Dieser Mechanismus verwendet URIs, aber darum müssen wir uns im Moment nicht weiter kümmern. Durch eine Qualifizierung sowohl der richtigen Verwendung als auch der Stellung von Tags wie <price> in unserem Beispiel kann man sich eher albern wirkende Tags wie <chair-price> und <cushion-price> ersparen. Statt dessen wird ein Namensraum mit einem Präfix eines XML-Elements verknüpft, was zu Tags wie <chair:price> und <cushion:price> führt. Ein XML-Parser kann dann zwischen diesen beiden Namensräumen unterscheiden, ohne völlig verschiedene Elementnamen benutzen zu müssen. Namensräume werden meistens in XML-Dokumenten verwendet, können aber auch in Schemata und XSLStylesheets wie auch in anderen XML-bezogenen Spezifikationen vorkommen. Die Empfehlung zu Namensräumen finden Sie unter http://www.w3.org/TR/REC-xml-names. XSL und XSLT http://www.oreilly.de/artikel/xml_einf.html (5 of 20) [6/10/2002 2:14:00 PM] Java and XSLT XSL ist die Extensible Stylesheet Language. XSL transformiert und übersetzt XML-Dateien von einem XML-Format in ein anderes. Stellen Sie sich beispielsweise vor, daß ein und dasselbe XML-Dokument in HTML, PDF und PostScript angezeigt werden muß. Ohne XSL müßte das XML-Dokument manuell dupliziert und dann in jedes dieser drei Formate konvertiert werden. Statt dessen stellt XSL einen Mechanismus bereit, in dem sogenannte Stylesheets ("Vorlagen") definiert werden, die diese Konvertierungsaufgaben übernehmen. Anstatt für eine andere Repräsentation die Daten ändern zu müssen, sorgt XSL für eine vollständige Trennung der Daten (dem Inhalt) von deren Präsentation. Wenn ein XML-Dokument auf eine andere Repräsentation abgebildet werden muß, dann ist XSL eine hervorragende Lösung. Es stellt eine Methode zur Verfügung, die mit dem Schreiben eines Java-Programms vergleichbar ist, das Daten in ein PDFoder HTML-Dokument konvertiert, verwendet aber eine standardisierte Schnittstelle, die diese Aufgabe erledigt. Um diese Umformung durchzuführen, kann ein XSL-Dokument Formatierungsobjekte enthalten. Diese Formatierungsobjekte sind Tags mit besonderen Namen, die durch den passenden Inhalt für den Ziel-Dokumenten-Typ ersetzt werden. Ein häufig vorkommendes Formatierungsobjekt kann beispielsweise einen Tag definieren, den ein Prozessor bei der Umwandlung eines XMLDokuments in PDF verwendet. In diesem Fall würde der Tag durch PDF-spezifische Informationen ersetzt werden. XSL hat seit kurzem den Status einer "Proposed Recommendation", weitere Informationen zu XSL finden Sie unter http://www.w3.org/TR/xsl. Wir werden uns hier mehr auf XSLT konzentrieren, einen vollständig textbasierten Umwandlungsvorgang. Während einer XSLT (Extensible Stylesheet Language Transformation) werden ein XSL-Text-Stylesheet und ein textuelles XML-Dokument "zusammengeführt", und das Ergebnis sind die entsprechend dem XSL-Stylesheet formatierten XML-Daten. Um dieses schwierige Konzept etwas zu verdeutlichen, schauen Sie sich bitte eine weitere XML-Datei an, die in Beispiel 2 zu sehen ist. Beispiel 2: Eine weitere XML-Beispieldatei XML File <?xml version="1.0"?> <?xml-stylesheet href="hello.xsl" type="text/xsl"?> <!-- Here is a sample XML file --> <page> <title>Testseite</title> <content> <paragraph>What you see is what you get!</paragraph> </content> </page> Dieses Dokument definiert sich selbst als XML Version 1.0 und nennt dann das dazugehörige XSL-Stylesheet, hello.xsl. Das sieht ähnlich wie die Verwendung einer DTD aus: So wie eine DTD in XML referenziert werden kann, um anzugeben, wie die Daten strukturiert werden können, kann eine XSL-Datei referenziert werden, um zu bestimmen, wie die Daten präsentiert und angezeigt werden sollen. Beispiel 3 zeigt das referenzierte XSL-Stylesheet. Beispiel 3: Das Stylesheet für Beispiel 2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="page"> <html> <head> <title> <xsl:value-of select="title"/> </title> http://www.oreilly.de/artikel/xml_einf.html (6 of 20) [6/10/2002 2:14:00 PM] Java and XSLT </head> <body bgcolor="#ffffff"> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="paragraph"> <p align="center"> <i> <xsl:apply-templates/> </i> </p> </xsl:template> </xsl:stylesheet> Dieses Stylesheet wurde dafür entworfen, unser einfaches XML-Dokument und dessen Daten in HTML-Code umzuwandeln, der in einem Web-Browser angezeigt werden kann. Auf die meisten Details kommen wir später noch zurück; hier wollen wir nur auf die <xsl:template match="[element name]">-Tags eingehen. Jedesmal, wenn ein solcher Tag auftritt, wird das Element beim passenden Tag wie etwa paragraph durch den Inhalt des XSL-Stylesheets ersetzt; in diesem Fall ein <p>-Tag durch einen kursiven Font. Das Ergebnis der Transformation des XML-Dokuments durch das XSL-Stylesheet sehen Sie in Beispiel 4. Beispiel 4: HTML-Ergebnis zu den Beispielen 2 und 3 <html> <head> <title> Testseite </title> </head> <body bgcolor="#ffffff"> <p align="center"> <i> What you see is what you get! </i> </p> </body> </html> Machen Sie sich jetzt noch keine Sorgen darüber, daß Sie nicht alle Feinheiten von XSL und XSLT verstehen; merken Sie sich im Moment nur, daß man mit XML und XSL hochflexible Dokumentenformate aus den gleichen zugrundeliegenden XML-Daten bekommen kann. XSLT ist seit 1999 offizielle W3C-Empfehlungen, Sie können sie unter http://www.w3.org/TR/xslt einsehen. Weitere Informationen zu XSL und XSLT finden Sie in Kapitel 6, XML umwandeln von Java und XML und in den Büchern XSLT und Java and XSLT. XPath XPath (XML Path Language) ist eine eigenständige Spezifikation, wird aber massiv von XSLT verwendet. Die XPath-Spezifikation definiert, wie ein bestimmtes Element in einem XMLDokument gefunden werden kann. Das geschieht durch das Referenzieren bestimmter Knoten (nodes) im XML-Dokument, wobei Knoten hier ein beliebiges Stückchen XML-Daten bedeutet, wozu Elemente, Attribute und textuelle Daten gehören. In der XPath-Spezifikation gilt ein XMLDokument als Baum aus diesen Knoten, und jeder Knoten kann durch seine Position im Baum angegeben werden. Wir brauchen nicht näher auf XPath eingehen, wenn wir nicht XSL und http://www.oreilly.de/artikel/xml_einf.html (7 of 20) [6/10/2002 2:14:00 PM] Java and XSLT XSLT genauer besprechen, aber prinzipiell werden Sie XPath immer dann verwenden müssen, wenn Sie eine Referenz auf ein bestimmtes Stückchen Daten in einem XML-Dokument brauchen. Um Ihnen zu zeigen, was Sie erwartet, folgt hier als Beispiel ein XPath-Ausdruck: *[not(self::JavaXML:Title)] Dieser Ausdruck hier wertet alle Kindelemente des aktuellen Elements aus, deren Name nicht JavaXML:Title ist. Für das Dokumentenfragment <JavaXML:Book> <JavaXML:Title>Java and XML</JavaXML:Title> <JavaXML:Content> <!-- Hier stehen die Kapitel --> </JavaXML:Content> <JavaXML:Copyright>&OReillyCopyright;</JavaXML:Copyright> </JavaXML:Book> ergibt das Auswerten des Ausdrucks für das Element JavaXML:Book als aktuellem Knoten die Elemente JavaXML:Content und JavaXML:Copyright. Die vollständige XPathSpezifikation ist online unter http://www.w3.org/TR/xpath nachzulesen. XML Schema XML Schema wurde entworfen, um DTDs zu ersetzen und zu erweitern. XML Schema ist ein XML-zentriertes Mittel, um XML-Dokumente einzuschränken. Obwohl wir uns bisher nur kurz mit DTDs auseinandergesetzt haben, gibt es bei diesen doch einige ziemlich kritische Einschränkungen: Sie kennen die Hierarchie nicht, haben Schwierigkeiten beim Umgang mit Namensraum-Konflikten, und es ist mit ihnen nicht möglich, Beziehungen zwischen XMLDokumenten anzugeben. Das ist auch verständlich, denn die Mitglieder der Arbeitsgruppe, die die Spezifikation erarbeitete, konnten nicht ahnen, daß XML auf so viele verschiedene Arten und Weisen verwendet werden würde! Die Einschränkungen von DTD sind aber für XML-Autoren und -Entwickler ziemlich unangenehm geworden. Am wichtigsten an XML Schema ist, daß es DTDs wieder mit XML auf eine Linie bringt. Das klingt möglicherweise verwirrend, aber denken Sie daran, daß jedes Kürzel, über das wir bisher geredet haben, XML-Dokumente verwendet, um seinen Zweck zu definieren. XSL-Stylesheets, Namensräume und alle anderen verwenden XML, um bestimmte Anwendungen und Eigenschaften von XML zu definieren. Aber eine DTD ist etwas ganz anderes. Eine DTD sieht nicht aus wie XML, besitzt nicht die hierarchische Struktur von XML und repräsentiert Daten nicht auf die gleiche Weise. Das macht DTDs zu einem Außenseiter in der XML-Welt, und weil DTDs derzeit definieren, wie XML-Dokumente aufgebaut sein müssen, hat dies zu einiger Verwirrung geführt. XML Schema behebt dieses Problem, indem es zu XML selbst zurückkehrt, um XML zu definieren. Wir haben bereits ziemlich viel über das "Definieren von Daten über Daten" gesprochen, und XML Schema macht ebenfalls genau dies. Die XML SchemaSpezifikation bringt XML dem Ziel näher, alle Konstrukte in der gleichen Sprache zu haben, anstelle mit DTDs als einer notwendigen, aber üblen Abweichung zu jonglieren. Die W3C- und XML-Entwickler waren so klug zu erkennen, daß es vergebliche Liebesmüh sein würde, DTDs zu verbessern. Statt dessen wurde zusätzlich XML Schema entwickelt, das DTDs ersetzen soll und dabei die Probleme behebt, mit denen DTDs nicht zurechtkommen. Außerdem wird an Verbesserungen im Hinblick auf die derzeit uneinheitliche Verwendung von XML gearbeitet. XML Schema ist seit Mai 2001 eine abgeschlossene offizielle W3C-Empfehlung. Sie besteht aus drei Teilen: Part 0, Primer (http://www.w3.org/TR/xmlschema-0/) ist ein nützliches Tutorial, Part 1, Structures (http://www.w3.org/TR/xmlschema-1/) und Part 2, Datatypes (http://www.w3.org/TR/xmlschema-2/) sind die eigentliche Schema-Spezifikation. http://www.oreilly.de/artikel/xml_einf.html (8 of 20) [6/10/2002 2:14:00 PM] Java and XSLT Und alle anderen ... Wir sind jetzt durch eine sehr kurze Einführung einiger der wichtigsten Spezifikationen aus dem XML-Bereich, die wir in diesem Buch behandeln werden, hindurchgerast. Ihnen fallen möglicherweise noch ein oder zwei Kürzel ein, die wir bisher noch nicht behandelt haben, wenn nicht sogar mehr. Wir haben hier nur die Abkürzungen ausgewählt, die für unsere Beschreibung der Verarbeitung von XML in Java besonders wichtig sind. Es gibt noch eine ganze Reihe weitere, von denen einige hier mit den URLs der entsprechenden Empfehlungen oder Arbeitspapiere aufgeführt sind: ● ● ● ● ● ● Resource Description Framework (RDF): http://www.w3.org/RDF/ XLink: http://www.w3.org/TR/xlink/ XPointer: http://www.w3.org/TR/xptr/ XHTML: http://www.w3.org/TR/xhtml-basic/ XMLBase: http://www.w3.org/TR/xmlbase/ XQuery: http://www.w3.org/TR/xquery/ Auch diese Liste ist bei weitem nicht vollständig, laufend kommen weitere neue Technologien hinzu. Nur weil wir nicht alle nennen können, sollten Sie aber nicht denken, daß sie weniger wichtig sind; sie sind nur nicht so unabdingbar, wenn es um die Manipulation von XML-Daten in Java geht. Zum vollständigen Verständnis und zum Beherrschen von XML gehört natürlich auch die Kenntnis dieser Spezifikationen neben denen, die wir detaillierter besprochen haben. Wie benutze ich das? All die großartigen Ideen, die XML uns gebracht hat, sind nicht besonders nützlich ohne die Werkzeuge, mit denen wir sie in unseren gewohnten Programmierumgebungen verwenden können. Glücklicherweise ist XML von Anfang an zusammen mit Java verwendet worden, und Java enthält die vollständigste Menge von APIs zur direkten Verwendung von XML. Zwar holen C, C++ und Perl schnell auf, aber Java setzt weiterhin die Standards, wie XML in Applikationen verwendet werden soll. Es gibt zwei grundlegende Abschnitte während des Lebenszyklus eines XML-Dokuments aus Applikationssicht, wie in Abbildung 1 zu sehen ist. Zuerst wird das Dokument geparst, und dann werden die Daten manipuliert. Abbildung 1: Die Sicht der Applikation auf den Lebenszyklus eines XML-Dokuments Als Java-Entwickler können wir uns glücklich schätzen, daß wir einfache Möglichkeiten haben, diese Aufgaben und andere zu erledigen. SAX http://www.oreilly.de/artikel/xml_einf.html (9 of 20) [6/10/2002 2:14:00 PM] Java and XSLT SAX ist die Simple API for XML. Es stellt ein ereignisbasiertes Framework zum Parsen von XML-Daten bereit, also für den Prozeß des Durchlesens des Dokuments und des Zerteilens der Daten in benutzbare Teile. Für jeden Schritt definiert SAX Ereignisse, die auftreten können. Beispielsweise definiert SAX ein Interface org.xml.sax.ContentHandler, das Methoden wie startDocument( ) und endElement( ) definiert. Das Implementieren dieses Interfaces ermöglicht die vollständige Kontrolle über die einzelnen Abschnitte des XMLParsing-Vorgangs. Es gibt ein ähnliches Interface für die Behandlung von Fehlern und lexikalischen Konstrukten. Eine Reihe von Fehlern und Warnungen ist definiert, was das Reagieren auf Situationen ermöglicht, die beim Parsen von XML-Dokumenten auftreten können, wie etwa das Auftreten ungültiger oder nicht wohlgeformter Dokumente. Es kann zusätzliches Verhalten hinzugefügt und der Parsing-Vorgang auf diese Weise angepaßt werden, was die Definition sehr applikationsspezifischer Aufgaben ermöglicht, und alles mit einem StandardInterface auf XML-Dokumente. Die SAX-API-Dokumente und weitere Informationen über die aktuelle Version SAX 2.0 finden Sie unter http://www.megginson.com/SAX. Bevor wir hier weitermachen, ist es wichtig, ein häufiges Mißverständnis über SAX aufzuklären. SAX wird oft mit einem XML-Parser verwechselt. Wir besprechen SAX hier sogar als eine Möglichkeit, XML-Daten zu parsen. SAX stellt aber ein Framework bereit, das Parser verwenden können, und definiert Ereignisse, die im Parsing-Vorgang überwacht werden können. SAX muß einen Parser bekommen, damit überhaupt XML geparst werden kann. Das hat zu vielen hervorragenden Parsern in Java geführt, darunter Project X von Sun, Xerces von der Apache Software Foundation, XML-Parser von Oracle und XML4J von IBM. All diese Parser können in die SAX-APIs eingestöpselt werden und führen zu geparsten XML-Daten. SAX-APIs bieten ein Mittel, um ein Dokument zu parsen, sind aber selbst keine XML-Parser. DOM DOM ist eine API für das Document Object Model. Während SAX nur den Zugriff auf die Daten in einem XML-Dokument ermöglicht, wurde DOM entworfen, um diese Daten auch manipulieren zu können. DOM wurde als Verfahren entworfen, das ein XML-Dokument als Baum repräsentiert. Weil ein Baum eine uralte Datenrepräsentation ist, ist das Traversieren und Manipulieren von Baumstrukturen in den meisten Programmiersprachen sehr einfach zu bewerkstelligen - so auch in Java. DOM liest das gesamte XML-Dokument in den Speicher ein und speichert alle Daten in Knoten (nodes), so daß man sehr schnell auf das gesamte Dokument zugreifen kann: Es befindet sich vollständig im Speicher, solange der DOM-Baum existiert. Jeder Knoten repräsentiert ein Datenstückchen, das aus dem ursprünglichen Dokument geholt wurde. DOM hat aber einen bedeutsamen Nachteil. Weil DOM das gesamte Dokument in den Speicher liest, können die zur Verfügung stehenden Ressourcen stark in Anspruch genommen werden, was eine Applikation erheblich bremsen oder sogar unbenutzbar machen kann. Je größer und komplexer das Dokument ist, um so auffälliger wird dieser Performance-Verlust. Denken Sie daran, daß DOM zwar eine gute Möglichkeit zum Manipulieren von XML-Daten ist, aber bei weitem nicht die einzige. Wir werden uns eine ganze Zeitlang mit DOM beschäftigen, aber auch Code schreiben, der die Daten direkt von SAX aus manipuliert. Die Anforderungen Ihrer Applikation werden in den meisten Fällen schon darauf hindeuten, welche Lösung für Ihr jeweiliges Entwicklungsprojekt die beste ist. Die DOM-Empfehlungen des W3C können Sie unter http://www.w3.org/DOM nachlesen. JAXP JAXP ist die Java API for XML Parsing von Sun. Dies ist ein relativ neues Werkzeug im Arsenal des XML-Entwicklers, das die SAX- und DOM-APIs vervollständigen soll. Es steht aber nicht in Konkurrenz zu diesen APIs und soll sie auch nicht ersetzen, sondern fügt einfach nur ein paar bequeme Methoden hinzu, die die Verwendung der XML-APIs erleichtern sollen. JAXP gehorcht den SAX- und DOM-Spezifikationen sowie der Namensraum-Empfehlung, die wir http://www.oreilly.de/artikel/xml_einf.html (10 of 20) [6/10/2002 2:14:00 PM] Java and XSLT weiter oben besprochen haben. JAXP definiert das Verhalten von SAX oder DOM nicht um, stellt aber sicher, daß alle XML-konformen Parser von Java-Applikationen aus über eine standardisierte Abstraktionsschicht erreicht werden können. Man erwartet, daß sich JAXP mit SAX und DOM weiterentwickeln wird. Im Moment ist JAXP 1.1 beispielsweise in J2SETM 1.4 und J2EETM 1.3 eingebaut und als optionales Paket für JDK 1.1.8 erhältlich. Die vollständige JAXP-Spezifikation finden Sie unter http://java.sun.com/xml. Diese drei APIs stellen den Werkzeugkasten des Java-Programmierers dar, wenn es um XML geht. Sie liefern einen Mechanismus, um XML-Daten in normalem Java-Code zu lesen und zu manipulieren, auch wenn das vielleicht nicht ihr eigentlicher Zweck ist. Diese APIs werden im gesamten Buch unsere Arbeitspferde sein, und wir werden lernen, jeden Aspekt der enthaltenen Klassen zu verwenden. Warum sollte ich XML verwenden? Sie haben jetzt einen ersten Eindruck von der Buchstabensuppe der XML-Technologien gewonnen. Ihnen ist auch klar geworden, daß XML mehr ist als einfach eine weitere Präsentationsschicht. Aber Sie sind sich nicht sicher, wie XML in die Applikationen paßt, die Sie bei der Arbeit verwenden. Sie haben Zweifel, ob Sie Ihren Chef davon überzeugen können, Sie während der Arbeitszeit mehr über XML lernen zu lassen, weil Sie nicht wissen, wie XML Ihnen helfen kann, bessere Applikationen zu entwickeln. Sie denken sogar darüber nach, einige XMLWerkzeuge zu evaluieren, wissen aber nicht, wo Sie anfangen sollen. Wenn dies Ihre jetzige Situation beschreibt und Sie von der neuen Technologie begeistert sind, aber nicht wissen, wie Sie jetzt weitermachen sollen, dann lesen Sie weiter! In diesem Abschnitt werden wir XML in die Scheinwerfer von realen Applikationen rücken und Ihnen Gründe dafür liefern, warum Sie XML bereits heute in Ihren Applikationen verwenden sollten. Zuerst schauen wir uns an, wie XML bereits in Applikationen verwendet wird, und liefern Ihnen die Informationen, mit denen Sie Ihren Chef überzeugen können, daß "alle das machen". Anschließend schauen wir uns die vorhandene Unterstützung für XML und verwandte Technologien an - alles im Hinblick auf Java-Applikationen. In Java gibt es eine Vielzahl von verfügbaren Parsern, Umformern, Publishing Engines und Frameworks, die extra für XML entworfen worden sind. Schließlich werden wir einen Blick darauf werfen, in welche Richtung sich XML bewegt und wie es in sechs Monaten und einem Jahr aussehen wird. Das ist die Information, mit der Sie den Chef Ihres Chefs überzeugen können, daß XML nicht nur dabei hilft, mit den Mitbewerbern mitzuhalten, sondern auch dabei eine führende Stellung in der Industrie einzunehmen - und Ihnen die nächste Beförderung einbringt! Java und XML: Wie geschaffen füreinander Selbst wenn Sie bereits überzeugt sind, daß XML eine großartige Technologie ist und daß es die Welt im Sturm erobern wird, haben wir noch keine Gründe dafür geliefert, warum es hier um Java und XML geht und nicht nur um XML allein. Java ist nämlich das ideale Gegenstück zu XML. Das kann man in einem einzigen Satz begründen: Java bedeutet portablen Code, und XML bedeutet portable Daten. Beide Technologien für sich sind schon großartig, haben aber noch Einschränkungen. Entwickler müssen sich Formate für Netzwerkdaten und Präsentationsformate ausdenken und Technologien wie JavaServer PagesTM (JSP) verwenden, die keine echte Trennung zwischen Inhalt und Präsentationsschicht bieten. XML bedeutet einfach Metadaten, und ohne Programme wie Parser und XSL-Prozessoren ist XML nicht mehr als "Vaporware", heiße Luft also. Java und XML zusammen füllen aber die Lücken im Gesamtbild der Anwendungsentwicklung. Das Verwenden von Java-Code stellt sicher, daß jedes Betriebssystem und jede Hardware mit einer JavaTM Virtual Machine ( JVM) Ihren kompilierten Bytecode ausführen kann. Fügen Sie dazu die Fähigkeit hinzu, Ein- und Ausgaben in Ihrer Applikation mit einer http://www.oreilly.de/artikel/xml_einf.html (11 of 20) [6/10/2002 2:14:00 PM] Java and XSLT systemunabhängigen, standardisierten Datenschicht repräsentieren zu können, und Ihre Daten sind portabel. Ihre Applikation ist damit vollständig portabel und kann mit anderen Applikationen mit den gleichen (weithin akzeptierten) Standards kommunizieren. Und als wenn das noch nicht genug wäre, hat Java von allen Programmiersprachen den umfangreichsten Satz an APIs, Parsern, Prozessoren, Publishing Frameworks und Werkzeugen für XML. Schauen wir uns mit diesem Synergiegedanken im Kopf an, wie diese beiden Technologien zusammenpassen, und zwar sowohl heute als auch morgen. XML heute Viele Entwickler und Hochtechnologie-Firmen haben zwar den Eindruck, daß XML ein hochaktuelles Thema ist und "Buzzword-Status" erreicht hat, aber das es für unternehmenskritische Anwendungen, auf die sich diese Firmen so sehr verlassen, noch nicht geeignet ist. Diese Annahme ist grundfalsch. XML und die zugehörigen Technologien, über die wir gesprochen haben, haben sich noch schneller einen sicheren Platz in der Applikationsentwicklung gesichert, als das bei Java der Fall war, als es vor einigen Jahren angekündigt wurde. Tatsächlich ist XML möglicherweise die einzige Neuerung in der Welt der Softwareentwicklung, die in der Bedeutung mit der Java-Plattform mithalten kann. Für uns als Entwickler ist es ein Glücksfall, daß sich diese Technologien ergänzen, anstatt miteinander zu konkurrieren. Mit Java und XML steht die Portabilität von Applikationen und Daten heute so hoch im Kurs wie noch nie und wird bereits massiv verwendet, auch jetzt, während Sie gerade diesen Text lesen. XML als Präsentationsschicht Der beliebteste Anwendungszweck von XML ist die Trennung von Inhalt und Präsentation. In dieser Situation definieren wir den Applikations-Inhalt als die Daten, die einem Client angezeigt werden müssen, und die Applikations-Präsentation als die Formatierung dieser Daten. Beispielsweise wären der Benutzername und die Adresse des Benutzers im Verwaltungsteil eines Bestellsystems Inhalt, während die HTML-formatierte Seite mit Bildern und Firmenlogo die Präsentation wäre. Der hauptsächliche Unterschied besteht darin, daß der Inhalt in der Applikation überall gleich und überall gleichermaßen gültig ist, unabhängig davon, welche clientspezifische Formatierung notwendig ist. Die Präsentation dagegen ist von der Art des Clients abhängig (Web-Browser, WAP-Telefon, Java-Applikation) und von dessen Fähigkeiten (HTML 4.0, Wireless Markup Language (WML), JavaTM Swing), die Daten darzustellen. XML dient dazu, den Inhalt zu repräsentieren, während XSL und XSLT eine für den Client passende Präsentation liefern. Eine der wichtigsten Herausforderungen für heutige Applikationen, und insbesondere für WebApplikationen, ist die Vielzahl von Clients, die diese Applikation eventuell verwenden wollen. Vor zehn Jahren verwendeten die Anwender fast immer PCs, bei denen die Software auf ihren Desktop-Rechnern installiert wurde; vor drei Jahren waren die Applikations-Clients fast immer Internet-Web-Browser, die HTML verstanden. Heutige Clients benutzen Web-Browser auf einer Vielzahl von Betriebssystemen, drahtlosen Mobiltelefonen, die die Wireless Markup Language (WML) unterstützen, und Taschen-Organizern, die eine Untermenge von HTML unterstützen. Diese Vielfalt von Client-Typen führt oft dazu, daß es viele Versionen von einer Applikation gibt - je eine pro unterstütztem Client - und trotzdem nicht alle vorkommenden Clients unterstützt werden. Obwohl eine Applikation ein Mobiltelefon natürlich nicht unterstützen muß, ist es sicherlich von Vorteil, wenn die Angestellten oder die Kunden den Dienst benutzen können, wenn sie ein solches haben; und auch wenn man mit einem Taschen-Organizer nicht alles das machen kann, was man mit einem Web-Browser macht, würden Geschäftsreisende, die ihre Spesenabrechnungen online bearbeiten, das sicherlich auch gern mit dem Organizer erledigen. Der Übergang von Software mit hoher Funktionalität, die nur bestimmte Clients unterstützt, zu Software mit einer Standardfunktionalität, die einer gewaltigen Vielzahl von Client-Typen zur Verfügung steht, hat viele Entwickler und Firmen ratlos gemacht. XML kann das Mittel gegen diese Ratlosigkeit sein. http://www.oreilly.de/artikel/xml_einf.html (12 of 20) [6/10/2002 2:14:00 PM] Java and XSLT Wir haben zwar weiter oben gesagt, daß XML keine Präsentationstechnologie ist, aber es kann durchaus dazu verwendet werden, eine Präsentationsschicht zu erzeugen. Wenn Sie meinen, daß diese beiden Aussagen doch das gleiche sind, dann überlegen Sie sich einmal folgendes: HTML ist eine Präsentationstechnologie. Es ist eine Markup-Sprache, die speziell für grafische Ansichten von Inhalten mit Web-Browser-Clients entworfen wurde. Aber HTML ist in keiner Weise eine gute Datenrepräsentation. Ein HTML-Dokument ist nicht leicht zu parsen, zu durchsuchen oder zu manipulieren. Es hat nur ein lose definiertes Format und besteht mindestens zur Hälfte, wenn nicht noch zu einem größeren Teil, aus Präsentationsinformationen - und die eigentlichen Daten sind nur ein kleiner Teil des Dokumentes. XML ist dagegen etwas ganz anderes, es ist eine daten-gesteuerte Markup-Sprache. Fast alles in einem XML-Dokument sind Daten und deren Struktur. Nur Anweisungen an den XML-Parser oder die umgebende Applikation sind nicht daten-zentriert. XML kann aufgrund seiner strikten Struktur, die eine DTD oder ein Schema erzwingen kann, einfach mit APIs und Werkzeugen durchsucht und manipuliert werden. Das macht XML alles andere als präsentationsorientiert. Aber XML kann gemeinsam mit den Begleittechnologien XSL und XSLT zur Präsentation verwendet werden. XSL ermöglicht die Definition von Präsentations- und Formatierkonstrukten sowie Anweisungen, wie diese Konstrukte auf die Daten in einem XML-Dokument anzuwenden sind. Und mit Hilfe von XSLT kann der ursprüngliche XML-Code einem Client auf vielerlei Weise angezeigt werden, darunter auch in sehr komplexem HTML. Trotzdem bleibt das zugrundeliegende XML-Dokument von irgendwelchen präsentationsspezifischen Informationen getrennt und kann genauso einfach in einen ganz anderen Präsentationsstil wie etwa ein SwingBenutzer-Interface überführt werden, ohne daß der zugrundeliegende Inhalt geändert werden müßte. Die vielleicht mächtigste Komponente, die XML und XSL zur Präsentation beisteuern, ist die Fähigkeit, mehrere Stylesheets für ein XML-Dokument anzugeben oder XSL-Stylesheets extern auf ein XML-Dokument aufzusetzen. Das fügt der Präsentation noch eine weitere Flexibilitätsebene hinzu, weil nicht nur ein und dasselbe XML-Dokument für verschiedene Präsentationen verwendet werden kann, sondern ein Publishing Framework, das eine Umformung durchführt, kann auch ermitteln, was für ein Client das XML-Dokument anfordert, und auf dieser Basis das richtige Stylesheet auswählen. Es gibt zwar kein standardisiertes Verfahren für diesen Vorgang und auch keine standardisierte Menge von Codes für die verschiedenen Client-Typen, aber ein XML-Publishing Framework kann Möglichkeiten bereitstellen, um eine solche dynamische Umformung zu gewährleisten. Der Vorgang, mehrere XSL-Stylesheets in einem XML-Dokument anzugeben, ist nicht herstellerabhängig, weswegen die einzigen Framework-Details, über die Sie sich in Ihrem XML-Dokument Gedanken machen müssen, die eine oder andere zusätzliche Verarbeitungsanweisung sein könnten. Weil diese einfach ignoriert werden, wenn eine Applikation sie nicht unterstützt, bleiben die XMLDokumente vollständig portabel und standardkonform. XML als Kommunikationswerkzeug Neben diesen nützlichen Umformungsfähigkeiten können das gleiche XML-Dokument und seine Daten auch dazu verwendet werden, um Informationen zwischen Applikationen auszutauschen. Diese Kommunikation erreicht man ziemlich leicht, weil die XML-Daten nicht an irgendeinen Client-Typ gebunden sind, ja nicht einmal daran, überhaupt von einem Client verwendet zu werden. Außerdem ist XML eine sehr einfache Datenrepräsentation, die sich sehr leicht über ein Netzwerk übertragen läßt. Dieser Kommunikationsaspekt von XML ist wahrscheinlich das am häufigsten übersehene und unterschätzte Feature von XML-Dokumenten und Datenrepräsentationen. Um die Bedeutung von XML für Kommunikationen richtig verstehen zu können, müssen Sie zunächst Ihre Vorstellung von einem Applikations-Client erweitern. Als wir über Präsentationen gesprochen haben, sind wir immer davon ausgegangen, daß ein Client ein Benutzer ist, der einen Teil der Applikation ansehen will. Das ist aber in heutigen Applikationen eine ziemlich eingeschränkte Sichtweise, die wir hiermit verwerfen wollen. Nehmen Sie statt dessen an, daß ein Client irgend etwas (ja, irgend etwas!) ist, das in einer Applikation auf Daten oder Dienste zugreifen will. Clients können Benutzer mit Computern oder mobilen Geräten sein, andere http://www.oreilly.de/artikel/xml_einf.html (13 of 20) [6/10/2002 2:14:00 PM] Java and XSLT Applikationen, Datenspeichersysteme wie Datenbanken oder Verzeichnisdienste und manchmal sogar die Applikation selbst mittels Callbacks. Wenn Sie den Client-Begriff dermaßen erweitern, dann beginnen Sie zu sehen, was für einen Einfluß XML hier haben kann. Fassen Sie zunächst diese Client-Typen in zwei Gruppen zusammen: eine Gruppe, die eine Präsentationsschicht benötigt, und eine, die das nicht tut. Am Anfang ist diese Unterscheidung vielleicht nicht einfach. Manche Benutzer schauen sich vielleicht Daten als HTML oder WML (Wireless Markup Language) an, aber eine andere Applikation braucht die Daten möglicherweise in einem etwas anderen Format, möglicherweise müssen sicherheitskritische Inhalte weggelassen oder verschiedene Elementnamen benutzt werden. Es wird wahrscheinlich selten der Fall sein, daß ein Client die Daten nicht auf irgendeine Weise formatiert benötigt, die dem Zweck entspricht, zu dem der Client die Daten haben will. Diese Übung sollte Sie davon überzeugen, daß Daten fast immer umgeformt werden, oft sogar mehrfach. Denken Sie etwa an ein XML-Dokument, das mittels eines XSL-Stylesheets in ein für eine andere Applikation nutzbares Format konvertiert wird (siehe Abbildung 2). Das Ergebnis ist weiterhin XML. Diese Applikation kann dann die Daten verwenden, um eine neue Ergebnismenge zu ermitteln und ein neues XML-Dokument zu erzeugen. Die ursprüngliche Applikation braucht diese Information dann auch, also wird das neue XML-Dokument in das von der ersten Applikation verwendete Format zurückkonvertiert, obwohl es jetzt andere Daten enthält! Dieses Szenario kommt sehr häufig vor. Die Sicht der Applikation auf den Lebenszyklus eines XML-Dokuments Abbildung 2: XML/XSL-Transformationen zwischen Applikationen Dieser wiederholte Vorgang des Konvertierens eines Dokuments, bei dem immer wieder ein neues XML-Ergebnis herauskommt, macht XML erst zu so einem mächtigen Werkzeug für die Kommunikation. In jedem Schritt können die gleichen Regeln angewendet werden, die immer von XML ausgehen, eines oder mehrere XSL-Stylesheets auf eine oder mehrere Transformationen anwenden und am Ende immer noch XML herausbekommen, das immer noch mit den gleichen Werkzeugen verwendet werden kann, die das Dokument ursprünglich erzeugt hatten. Bedenken Sie auch, daß XML eine rein textuelle Repräsentation der Datei ist. Weil Text so eine leichtgewichtigte und leicht serialisierbare Datenrepräsentation ist, hat man mit XML eine schnelle Möglichkeit, Daten über ein Netzwerk zu transportieren. Auch wenn manche binären Datenformate sehr effizient übertragen werden können, stellen sich textuelle NetzwerkÜbertragungen üblicherweise als das schnellere Kommunikationsverfahren heraus. http://www.oreilly.de/artikel/xml_einf.html (14 of 20) [6/10/2002 2:14:00 PM] Java and XSLT XML-RPC XML-RPC ist eine der Spezifikationen, die sich mit der Verwendung von XML für Kommunikationsaufgaben beschäftigen. Bei XML-RPC geht es nicht um die Kommunikation zwischen Applikationen, sondern um die Kommunikation zwischen Komponenten innerhalb einer Applikation oder mit einer gemeinsamen Menge von Diensten, die mehreren Applikationen dienen. RPC steht für Remote Procedure Calls, einem der wichtigsten Vorläufer der Remote Method Invocation (RMI). RPC wird für prozedurale Aufrufe über ein Netzwerk und zum Empfangen einer Antwort, ebenfalls über das Netzwerk, verwendet. Beachten Sie, daß das etwas ganz anderes ist als RMI, wo ein Client Methoden eines Objekts über Stubs und Skeletons (Skelette) aufrufen kann, die über das Netzwerk geladen werden. Der Hauptunterschied besteht darin, daß RPC eine entfernte Antwort erzeugt und diese über das Netzwerk zurückgeschickt wird; der Client interagiert nie direkt mit dem entfernten Objekt, sondern verwendet die RPCSchnittstellen, um einen Methodenaufruf anzufordern. Bei RMI kann ein Client direkt mit einem entfernten Objekt interagieren; es sind keine Proxies dazwischengeschaltet. Eine vollständigere Beschreibung von XML-RPC finden Sie unter http://www.xml-rpc.com. Was an RPC und speziell an XML-RPC besonders bemerkenswert ist, ist die Tatsache, daß diese nun eine gangbare Option für Aufrufe entfernter Dienste geworden sind. RPC ist wegen der Schwierigkeiten, ein standardisiertes Anfrage-Antwort-Modell bereitzustellen, in JavaApplikationen kaum zu finden und durch RMI ersetzt worden. Es gibt aber oft Situationen, in denen das Laden entfernter Stubs und Skeletons über das Netzwerk zu einer schlechteren Performance führt als das Senden und Empfangen textueller Daten. Das alte Problem von RPC war immer das Repräsentieren komplexer Objekte mit rein textuellen Informationen, und zwar sowohl für Anfragen als auch für Antworten. XML hat dieses Problem gelöst, was RPC wieder zu einer gangbaren Alternative macht, wenn es um das Kommunizieren von eige ntlich nicht zusammengehörigen Systemen geht. Mit einem Standard für das Repräsentieren beliebiger Datentypen in Textdokumenten kann eine XML-RPC-Engine die Instanzparameter eines Objekts auf XML-Elemente abbilden und diesen Objekt-"Graphen" am Server einfach dekodieren. Eine Antwort kann generiert und wiederum einfach in einen XML-"Graphen" umgewandelt und an den Client zurückgegeben werden (siehe Abbildung 3). Weitere Informationen zu XML-RPC finden Sie in Kapitel 10, XML-RPC, in Java und XML und in Programming Web Services with XML-RPC. Abbildung 3: XML-RPC-Kommunikation und -Messaging Business-to-Business Der letzte Einsatzbereich von XML für Kommunikationszwecke ist eigentlich kein anderer und keine andere Spezifikation als die, über die wir bereits gesprochen haben, aber das Auftreten des http://www.oreilly.de/artikel/xml_einf.html (15 of 20) [6/10/2002 2:14:00 PM] Java and XSLT Begriffs "Business-to-Business"-Handel und -Kommunikation ist doch erwähnenswert. Man meint damit die Kommunikation nicht nur zwischen verschiedenen Anwendungen, sondern auch zwischen verschiedenen Firmen und manchmal sogar zwischen verschiedenen Industrien. In diesen Fällen leistet XML wirklich einen wertvollen Dienst, der in der Vergangenheit nur den allergrößten Firmen zur Verfügung stand: die Kommunikation zwischen geschlossenen Systemen. Denken Sie beispielsweise an einen kleineren oder mittleren lokalen TelekomProvider. Wenn dieser eine Netzwerk-Leitung wie DSL oder T1 an einen Kunden verkauft, muß eine Reihe von Dingen passieren (siehe Abbildung 4). Der Provider der Leitung selbst, etwa UUNet, muß über die Anforderung einer neuen Leitung informiert werden. Der Provider muß einen Router konfigurieren, und dessen Einstellung muß mit dem Internet-Provider abgesprochen werden. Dann wird die Installation vorgenommen, was möglicherweise wiederum von einer weiteren Firma ausgeführt wird. Dieser relativ häufig vorkommende und einfache Verkauf einer Netzwerkleitung berührt bereits drei Firmen! Fügen Sie dazu noch den technischen Support des Router-Herstellers, den Telefon-Provider für die anderen Kommunikationsdienste des Kunden und das NIC zum Registrieren der Domain hinzu, und Sie sehen, was da alles dazugehört. Abbildung 4: Eine Netzwerkleitung zu einem Kunden mit proprietären Systemen einrichten Dieser etwas einschüchternde Vorgang kann mit XML extrem einfach gestaltet werden (wie in Abbildung 5 zu sehen ist). Stellen Sie sich vor, daß die erste Bestellung einer Leitung in ein System eingegeben wird, das die Bestellung in ein XML-Dokument umwandelt. Dieses Dokument wird dann mittels XSL in ein Format umgewandelt, das der Leitungslieferant, in unserem Beispiel UUNet, verstehen kann. UUNet fügt dann leitungsspezifische Informationen hinzu und konvertiert die Bestellung in ein weiteres XML-Dokument, das an den Provider zurückgegeben wird. Dieses neue Dokument wird dann unter Hinzufügen der Information, wo sich der Kunde befindet, an die Firma weitergeleitet, die die Installation vornimmt. Nach der Installation wird ein Vermerk, ob diese erfolgreich war oder nicht, an das Dokument angefügt, dieses wieder mittels XSL konvertiert und an den Provider zurückgeschickt. Das Schöne an dieser Lösung ist, daß nicht verschiedene Systeme mit jeweils herstellerspezifischen Formatierungen verwendet werden müssen, sondern in jedem Schritt die gleichen XML-APIs benutzt werden können, wodurch man eine Standardschnittstelle zu XML-Daten über Applikationen, Systeme und sogar Firmen hinweg hat. http://www.oreilly.de/artikel/xml_einf.html (16 of 20) [6/10/2002 2:14:00 PM] Java and XSLT Abbildung 5: Eine Netzwerkleitung zu einem Kunden mit XML-basierten Daten einrichten XML in der Konfiguration Ein letzter wichtiger, schon heute aktueller Anwendungsbereich von XML in Applikationen und Java-Technologien ist die Ebene der Applikationsserver. Die Enterprise Java Beans (EJB) 1.1Spezifikation verlangt, daß die Deployment-Deskriptoren für Enterprise JavaBeans, die das Verhalten von und andere Informationen über EJBs definieren, XML-basiert sind. Diese ersetzen die vorher verwendeten serialisierten Deployment-Deskriptoren. Diese Änderung wurde im EJBBereich sehr begrüßt, weil die Deployment-Deskriptoren damit nicht mehr herstellerspezifisch sind. Indem man verlangt, daß die Deployment-Deskriptoren alle einer vordefinierten DTD gehorchen, wird die Portabilität von EJB verbessert. XML wird auch in der Konfiguration der Version 2.2 der Servlet-API verwendet. Eine XMLDatei, die die zu verwendenden Connector-Parameter, die zu startenden Servlet-Kontexte und weitere Engine-spezifische Details spezifiziert, konfiguriert die Servlet-Engine selbst. XMLKonfigurationsdateien werden auch dazu verwendet, die einzelnen Servlets zu konfigurieren, was initiale Argumente, Aliasnamen für Servlets und das Vergleichen von URLs für bestimmte Servlet-Kontexte ermöglicht. Obwohl sowohl die EJB 1.1-Spezifikation als auch die Tomcat-Servlet-Engine in der Java-Welt ziemlich neu sind, kann man an deren Verwendung von XML für die Konfiguration der KernFunktionalität doch sehen, daß Sun beabsichtigt, XML auch weiterhin für solche Zwecke zu verwenden. In dem Maße, in dem XML-Parser immer einfacher verfügbar werden und vermarktbar sind, werden XML-basierte Konfigurationsdateien bei allen Server-Herstellern und Typen einschließlich nicht-Java-basierten Servern wie HTTP- und Datenbank-Servern verwendet werden. XML-Unterstützung In der zweiten Hälfte des Jahres 1999 nahm die Unterstützung von XML auf breiter Front zu, insbesondere im Java-Bereich. XML-Parser, XSLT-Prozessoren, Publishing Frameworks, XMLhttp://www.oreilly.de/artikel/xml_einf.html (17 of 20) [6/10/2002 2:14:00 PM] Java and XSLT Editoren und IDEs und eine Vielzahl verwandter Werkzeuge stehen jetzt zur Verfügung und werden sogar allmählich stabil und schnell. Obwohl das Thema dieses Buches die Java-APIs für die direkte Manupulation von XML sind, sind die Parser, Prozessoren und anderen Komponenten natürlich auf jeden Fall ein Bestandteil des gesamten XML-Prozesses, weswegen wir hier eine Reihe verfügbarer Komponenten auflisten. Weil sich die XML-Technologie so schnell verändert und die Hersteller immer mehr Zeit und Energie auf diesen Bereich verwenden, geben wir hier keine Versionsnummern an. Parser Eine der wichtigsten Schichten in einer XML-fähigen Applikation ist der XML-Parser. Diese Komponente hat die äußerst wichtige Aufgabe, das rohe XML-Dokument als Eingabe zu verarbeiten und irgend etwas Nützliches daraus zu machen; sie stellt sicher, daß das Dokument wohlgeformt ist, und wenn eine DTD oder ein Schema referenziert wird, kann sie möglicherweise auch überprüfen, ob das Dokument gültig ist. Das Ergebnis des Parsens eines XML-Dokuments ist typischerweise eine Datenstruktur, in unserem Fall eine Java-basierte, die einfach von anderen XML-Werkzeugen oder Java-APIs manipuliert und bearbeitet werden kann. Wir werden hier nicht detailliert auf diese Datenstrukturen eingehen. Es sei erst einmal nur festgestellt, daß der Parser eine der zentralen Komponenten bei der Verwendung von XMLDaten ist. Das Auswählen eines XML-Parsers ist keine einfache Aufgabe. Es gibt keine festen Regeln, aber üblicherweise wendet man zwei Kriterien an. Das erste ist die Geschwindigkeit des Parsers. Wenn XML-Dokumente immer öfter verwendet werden und immer größer werden, dann bekommt die Geschwindigkeit des XML-Parsers einen extrem großen Einfluß auf die GesamtPerformance der Applikation. Der zweite Faktor ist die Konformität zur XML-Spezifikation. Weil die Performance oft wichtiger ist als manche obskuren XML-Features, beachten manche Parser möglicherweise einige der speziellen Punkte der XML-Spezifikation nicht, um eine höhere Geschwindigkeit zu erzielen. Sie müssen selbst wissen, was Ihnen wichtiger ist, und eine angemessene Balance zwischen diesen beiden Punkten finden. Außerdem validieren manche XML-Parser, was bedeutet, daß sie optional Ihren XML-Code anhand einer DTD überprüfen, während andere das nicht tun. Stellen Sie sicher, daß Sie einen validierenden Parser verwenden, wenn Sie diese Eigenschaft in Ihren Applikationen benötigen. Hier folgt eine Liste der am häufigsten verwendeten XML-Parser. Aus dieser Liste geht nicht hervor, welche dieser Parser validieren und welche nicht, weil die Fähigkeit zur Validierung derzeit zu einer Reihe von Parsern hinzugefügt wird, die das noch nicht können. Die Liste enthält keine Bewertung, auch keine implizite, aber auf den einzelnen Web-Seiten zu den Parsern finden Sie sehr viele Informationen: ● ● ● ● ● ● ● ● Apache Xerces: http://xml.apache.org IBMs XML Parser for Java: http://alphaworks.ibm.com/tech/xml4j James Clarks XP: http://www.jclark.com/xml/xp Oracle XML Parser: http://technet.oracle.com/tech/xml Sun Microsystems Crimson: http://xml.apache.org/crimson Tim Brays Lark und Larval: http://www.textuality.com/Lark The Mind Electric's Electric XML: http://www.themindelectric.com/products/xml/xml.html Microsofts Parser MXSML: http://msdn.microsoft.com/xml/default.asp ACHTUNG: Ich habe Microsofts Parser MXSML in diese Liste aufgenommen in Anerkennung ihrer Bemühungen um Einhaltung der Standarts bei den neueren Versionen. Trotzdem tendiert der Parser immer noch dazu, "sein eigenes Ding zu machen". Verwenden Sie ihn, wenn sie ihn brauchen, aber seien Sie sich bewußt, daß diese Entscheidung zu zusätzlicher Arbeit führt. http://www.oreilly.de/artikel/xml_einf.html (18 of 20) [6/10/2002 2:14:00 PM] Java and XSLT Prozessoren Nachdem ein XML-Dokument geparst worden ist, wird es fast immer umgeformt. Diese Umformung geschieht, wie wir bereits besprochen haben, mittels XSLT. Ähnlich wie beim Parsen gibt es auch bei dieser Komponente des XML-Prozesses eine Reihe von Optionen. Auch hier sind die beiden Hauptkriterien wieder die Geschwindigkeit der Umformung und die Konformität mit den XSL- und XSLT-Spezifikationen. Die Web-Seiten zu den einzelnen Prozessoren liefern die besten Informationen hinsichtlich Konformität und PerformanceBenchmarks. ● ● ● ● ● Apache Xalan: http://xml.apache.org James Clarks XT: http://www.jclark.com/xml/xp/index.html Lotus XSL Processor: http://www.alphaworks.ibm.com/tech/LotusXSL Oracle XSL Processor: http://technet.oracle.com/tech/xml Michael Kays SAXON: http://saxon.sourceforge.net Publishing Frameworks XML-Publishing Framework ist ein etwas nebulöser Begriff und auf jeden Fall keine formale Definition. Für dieses Buch sei ein Publishing Framework für XML eine Sammlung von XMLWerkzeugen, die das Parsen, Umformen und möglicherweise weitere Optionen zur Verwendung von XML in Applikationen ermöglichen. Obwohl das Parsen und Umformen üblicherweise durch eines der bereits erwähnten Werkzeuge geschieht, bindet ein Publishing Framework diese Werkzeuge mittels Java-APIs zusammen und stellt so ein standardisiertes Interface für die Verwendung des Frameworks zur Verfügung. Fortgeschrittenere Frameworks erlauben sowohl das Verarbeiten von statischen XML-Dokumenten als auch von Java-Applikationen generiertem XML-Code, und manche enthalten sogar XML-Editoren und Komponenten-Editoren, um sicherzustellen, daß der erzeugte XML-Code den Beschränkungen des Frameworks gehorcht. Weil es keine Spezifikation gibt, wie sich eine XML-Applikation oder ein Framework verhalten sollte, gibt es gewaltige Unterschiede zwischen den hier genannten Frameworks. Jedes hat aber Vorteile, die es rechtfertigen, daß Sie ein wenig Zeit damit zubringen, die einzelnen Frameworks zu untersuchen und zu verwenden. Außerdem sind manche dieser Frameworks Open-SourceSoftware (OSS) und damit nicht nur leicht erhältlich, sondern auch offen in der Hinsicht, daß Sie genau sehen können, wie die Ergebnisse erreicht werden. ● ● ● ● Apache Cocoon: http://xml.apache.org Enhydra Application Server: http://www.enhydra.org Bluestone XML Server: http://www.bluestone.com/xml SAXON: http://saxon.sourceforge.net XML-Editoren und IDEs Es gibt viele gute XML-Parser und -Prozessoren, aber lange Zeit konnte man das gleiche nicht über XML-Editoren sagen. Viele Entwicklern verwenden Texteditoren wie vi, Emacs oder Notepad, inzwischen gibt es aber auch eine Reihe von speziellen XML-Editoren. Sie finden unter http://www.xmlsoftware.com eine exzellente, kommentierte Liste von XML- Editoren, mit der Sie sich über die neueste Software informieren können. O'Reilly Home | O'Reilly-Partnerbuchhandlungen | Bestellinformationen Kontakt | Über O'Reilly | Datenschutz http://www.oreilly.de/artikel/xml_einf.html (19 of 20) [6/10/2002 2:14:00 PM] Java and XSLT © 2001, O'Reilly Verlag http://www.oreilly.de/artikel/xml_einf.html (20 of 20) [6/10/2002 2:14:00 PM]