Script XML. Martin Ruppert



Ähnliche Dokumente
HTML5. Wie funktioniert HTML5? Tags: Attribute:

Übungsaufgaben zu XML:

... MathML XHTML RDF

WEBSEITEN ENTWICKELN MIT ASP.NET

XSL Templates. Mit Templates arbeiten. XSL Templates

XML Grundlagen. Andreas Rottmann,Sebastian Riedl. 27. August Quit Full Screen Previous Page Next Page GoTo Page Go Forward Go Back

4 Aufzählungen und Listen erstellen

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Kapitel 3 Frames Seite 1

IT-Zertifikat: Daten- und Metadatenstandards. Transformation von XML-Dokumenten mit XSLT (und XPATH) XSLT kurz und knackig. XSLT und die Praxis

Webseite in XML Kurzeinführung

Einführung in XML von Julian Bart

Schiller-Gymnasium Hof

Einfügen von Bildern innerhalb eines Beitrages

HTML Programmierung. Aufgaben

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

Kennen, können, beherrschen lernen was gebraucht wird

1 Mathematische Grundlagen

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Arbeiten mit UMLed und Delphi

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

CSS-Grundlagen. Etwas über Browser. Kapitel. Die Vorbereitung

Es gibt situationsabhängig verschiedene Varianten zum Speichern der Dokumente. Word bietet im Menü DATEI unterschiedliche Optionen an.

Datenaustauschformate. Datenaustauschformate - FLV

Grundlagen der Theoretischen Informatik, SoSe 2008

.htaccess HOWTO. zum Schutz von Dateien und Verzeichnissen mittels Passwortabfrage

Erstellen von x-y-diagrammen in OpenOffice.calc

Datenbanken Kapitel 2

Anleitung über den Umgang mit Schildern

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

Primzahlen und RSA-Verschlüsselung

Seite 1. Datum einfügen

GEONET Anleitung für Web-Autoren

Speichern. Speichern unter

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche

Die Formatierungsregeln (die so genannte Wiki-Syntax) für Texte in DokuWiki sind zu großen Teilen die selben, wie in anderen Wiki-Systemen.

Professionelle Seminare im Bereich MS-Office

Zahlen auf einen Blick

CSS. Cascading Stylesheets

Professionelle Seminare im Bereich MS-Office

Windows 7: Neue Funktionen im praktischen Einsatz - Die neue Taskleiste nutzen

Berechnungen in Access Teil I

1 topologisches Sortieren

Datensicherung. Beschreibung der Datensicherung

Anleitung zum erfassen von Last Minute Angeboten und Stellenangebote

Das Einsteigerseminar

Meine erste Homepage - Beispiele

Was meinen die Leute eigentlich mit: Grexit?

Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me

Bauteilattribute als Sachdaten anzeigen

Wie kann ich in der Backstage-Ansicht eigene Dokumentationen einbinden?

Barrierefreie Webseiten erstellen mit TYPO3

Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

So importieren Sie einen KPI mithilfe des Assistenten zum Erstellen einer Scorecard

11 Tabellen als Inhaltselement (ohne RichTextEditor)

Handbuch B4000+ Preset Manager

Informationen zu den regionalen Startseiten

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Online-Publishing mit HTML und CSS für Einsteigerinnen

Klaus Schild, XML Clearinghouse Namensräume

3. GLIEDERUNG. Aufgabe:

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Kapiteltests zum Leitprogramm Binäre Suchbäume

Beuth Hochschule Die erweiterbare Markierungssprache XML WS10/11

Erzherzog Johann Jahr 2009

Zeichen bei Zahlen entschlüsseln

Doku zur Gebäudebrüter Datenbank

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Kommunikations-Management

Um ein solches Dokument zu erzeugen, muss eine Serienbriefvorlage in Word erstellt werden, das auf die von BüroWARE erstellte Datei zugreift.

SANDBOXIE konfigurieren

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

FlowFact Alle Versionen

EINFACHES HAUSHALT- KASSABUCH


HTML5. Grundlagen der Erstellung von Webseiten. Linda York, Tina Wegener. 2. Ausgabe, 3. Aktualisierung, Januar 2013 HTML5

Mediator 9 - Lernprogramm

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Dokumentation von Ük Modul 302

Wie halte ich Ordnung auf meiner Festplatte?

4. AUSSAGENLOGIK: SYNTAX. Der Unterschied zwischen Objektsprache und Metasprache lässt sich folgendermaßen charakterisieren:

GRAF-SYTECO. Handbuch. Zeichensatzgenerator für AT-Geräte. Erstellt: November SYsteme TEchnischer COmmunikation

12. Dokumente Speichern und Drucken

Hilfe Bearbeitung von Rahmenleistungsverzeichnissen

Snippets - das Erstellen von "Code- Fragmenten" - 1

«/Mehrere Umfragen in einer Umfrage durchführen» Anleitung

Programme im Griff Was bringt Ihnen dieses Kapitel?

Da die Bedienung des Editors viele Möglichkeiten aufweist, aber auch etwas Übung voraussetzt, haben wir ihm ein eigenes Unterkapitel gewidmet.

Typo3 - Inhalte. 1. Gestaltung des Inhaltsbereichs. 2. Seitenunterteilung einfügen

EasyWk DAS Schwimmwettkampfprogramm

Kleines Handbuch zur Fotogalerie der Pixel AG

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

Inkrementelles Backup

Transkript:

Script XML Martin Ruppert 5. März 2015

Inhaltsverzeichnis 1 Einführung in XML 4 1.1 XML-Elemente...................................... 5 1.2 Attribute......................................... 9 1.3 Cascading Style Sheets (CSS).............................. 11 1.4 Namensräume....................................... 14 1.5 Document Type Definition (DTD)............................ 17 1.6 XSL Transformation (XSLT)............................... 22 1.7 Baumstruktur Daten serialisieren........................... 33 1.8 XML-Anwendungen.................................... 34 2

Dieser Text ist nur als Begleitmaterial zur Vorlesung zu verwenden verwendete Literatur: Alfred Nussbaumer/Dr. August Mistlbacher, XML, mitp 3

Kapitel 1 Einführung in XML Dieses Kapitel soll die Möglichkeit geben, sich rasch in das Thema XML einzuarbeiten und so einen ersten Einblick zu gewinnen. Es werden wichtige, grundlegende Konzepte anhand von Beispielen gezeigt. Diese Beispiele werden kommentiert und sollten daher auch von Neulingen verstanden werden. Als erstes besprechen wir, wie man mit XML-Elementen und Attributen so genannte wohlgeformte XML-Dokumente erstellt und mithilfe von CSS 1 ausgibt. Anschließend wird die Idee von Namensräumen vorgestellt, um schließlich XML- Dokumente zu erstellen, die durch eine Document Type Definition kurz DTD beschrieben werden. Solche XML-Dokumente werden gültig genannt. Es folgt eine Darstellung der Extended Stylesheet Language Transformation (XSLT), einer mächtigen Sprache zur Ausgabe von XML-Dokumenten in unterschiedlichen Formaten. Ein etwas theoretischer Abschnitt behandelt die Struktur von XML-Daten, ein Thema, welches für viele fortgeschrittenere Aspekte wie beispielsweise dem Parsen von XML-Dateien grundlegend ist. Zuletzt stellen wir einige praktische Werkzeuge für das Arbeiten mit XML vor. Die spezialisierten XML-Editoren sind zwar ein bequemes Hilfsmittel mit entsprechenden unterstützenden Features, stellen aber keineswegs eine Voraussetzung für das Arbeiten mit XML dar. XML-Dateien sind einfache ASCII-Texte und können daher mit jedem beliebigen Texteditor geschrieben werden. Wenn man XML kennen lernen möchte, ist es sicher zunächst eine große Hilfe, die Verwandschaft von XML und HTML zu verwenden. Daher wird in dieser Einführung auf die Analogien und die Unterschiede dieser beiden Auszeichnungssprachen immer wieder hingewiesen. Es soll jedoch schon jetzt klargestellt werden, 1 Cascading Style Sheets 4

dass XML viel mehr ist als eine verbesserte Version von HTML. 1.1 XML-Elemente Ein HTML-Quelltext besteht aus so genannten Tags wie <p>, <h1>, <table> usw. Diese Tags haben eine wohldefinierte Bedeutung. Diese Bedeutung ist oft eine zweifache. Das Tag <h1> gibt beispielsweise an, dass es sich um eine Überschrift handelt und die Darstellung des Inhaltes daher in einer entsprechend großen Schrift und fett gedruckt erfolgen soll. HTML-Tags können also den Text einerseits strukturieren und legen andererseits die Art der Ausgabe im Browser fest. Eine XML-Datei enthält keine Tags, sondern Elemente. Diese Elemente sehen im Prinzip genauso aus wie HTML-Tags: Sie bestehen aus dem Start-Tag, dem eigentlichen Inhalt und dem End-Tag. Ihre Bezeichnung kann jedoch praktisch frei gewählt werden. Wenn man also eine XML-Datei schreibt, muss man sich zuerst die Namen für die Elemete überlegen. Wie bei einer HTML-Datei es genau ein Wurzel- Tag <html> gibt, muss es auch bei einer XML-Datei ein bestimmtes Element geben, dem alle anderen Elemente untergeordnet sind. Diese besondere Element nennt man Dokumentelement oder Wurzelelement. Tippen Sie den Text in einem beliebigen Editor und speichern Sie ihn mit der Endung xml. Anschließend können Sie die so erstellte XML-Datei mit einem Browser laden. computer1.xml: <?xml version="1.0" encoding="iso-8859-1"?> <!-- --> <!-- Kommentar: Eine erste XML-Datei --> <!-- --> <computer> <hersteller> PC-Maker </hersteller> <ram> 128MB </ram> 5

<festplatte> 20GB </festplatte> </computer> Das Dokumentelement von computer1.xml hat den Namen computer Ihm sind die Elemente <hersteller>, <ram> und <festplatte> untergeordnet. Man spricht in diesem Zusammenhang auch von Kindelementen oder umgekehrt von einem Elternelement. Beachten Sie, dass alle Elemente mit einem End-Tag abgeschlossen werden müssen. In HTML gibt es ja Tags wie <br>, die einfach für sich alleine stehen können. Auch wird es von den Browsern meist toleriert, wenn das Ende-Tag fehlt. Der Browser versucht in einem solchen Fall selber herauszufinden, wo das End-Tag stehen sollte. In XML sind derartige schlampige Schreibweisen verboten. Die Darstellung, die der Browser nach dem Laden von computer1.xml zeigt, ist gewöhnungsbedürftig. Die XML-Elemente erscheinen gemäß ihrer Stellung: Das Dokumentelement steht ganz links, die Kindelemente werden eingerückt. Damit kommen wir zu einem wesentlichen Unterschied von XML zu HTML. XML-Elemente beschreiben grundsätzlich nur die Struktur der in der XML-Datei enthaltenen Information. In unserem Beispiel enthält das XML-Dokument Daten zu einem Computer, die in drei Kindelementen abgelegt sind. Damit ist eine Struktur wie in einer Datenbank festgelegt. Im Gegensatz zu HTML-Tags enthalten XML-Elemente keinerlei Information, wie ihr Inhalt dargestellt werden soll. Daher kann ein Browser eine XML-Datei nicht so darstellen, wie man es von HTML-Dateien gewohnt ist. Die erste Zeile unserer XML-Datei enthält die XML-Deklaration. Sie gibt die verwendete XML-Version an. Optional kann mit dem Attribut encoding auch ein Zeichensatz ausgewählt werden. Der hier spezifizierte Zeichensatz ist jener für westeuropäische Schriften und ermöglicht daher die Verwendung der deutschen Sonderzeichen. Wir sehen auch, dass man einen Kommentar in einer XML-Datei genauso schreibt wie in einer HTML-Datei. Wenn man Daten zu mehreren Computern in einer XML-Datei unterbringen möchte, benötigt man eine neue Struktur. Vernünftigerweise wird man die Struktur, mit der man die Informationen zu einem Gerät speichert, nicht ändern zumindest, wenn sich diese Struktur bereits bewährt hat. Daher muss man sich ein neues Dokumentelement überlegen. Das Ergebnis könnte folgendermaßen aussehen. computer2.xml: 6

<?xml version="1.0" encoding="iso-8859-1"?> <pcliste> <computer> <hersteller> PC-Maker </hersteller> <ram> 128MB </ram> <festplatte> 20GB </festplatte> </computer> <computer> <hersteller> PC-Fabrikant </hersteller> <ram> 256MB </ram> <festplatte> 40GB </festplatte> </computer> </pcliste> Das neue Dokumentelement heißt pcliste. Es besitzt zwei Kindelemente vom Typ computer, die wie gehabt selber wiederum jeweils drei Kindelemente haben. Wenn der Browser diese Datei lädt, erkennt er, dass es sich um eine XML-Datei handelt und aktiviert einen XML-Parser. Dieser überprüft, ob die XML-Syntax erfüllt ist und es sich um eine wohlgeformte Datei handelt. Wenn ja, wird sie dargestellt, ansonsten zeigen Fehlermeldungen die vermutliche Ursache. In unserem Fall ist die Datei wohlgeformt und wir erhalten mit dem Browser das entsprechende Bild. Es gibt praktisch zwei Arten von XML-Elementen. Elemente mit Kindelementen, durch die eine Datenstruktur aufgebaut wird, und Elemente, die keine Kindelemente besitzten, dafür aber Inhalt haben und so die Träger der eigentlichen Daten sind. Wichtig ist, dass alle Elemente korrekt ineinander geschachtelt sind. 7

Wenn das nicht der Fall ist, liefert der Parser eine Fehlermeldung. Das ist bei der nächsten Datei der Fall. computer3.xml: <?xml version="1.0" encoding="iso-8859-1"?> <computer> <hersteller> PC-Maker </hersteller> <ram> 128MB </ram> <festplatte> <zugriffszeit> 20ms 20GB </festplatte> <!-- Hier müßte das End-Tag von "zugriffszeit" stehen --> </zugriffszeit> </computer> Das neu eingefügte Element <zugriffszeit> ist ein Kindelement von <festplatte>. Daher muss das End-Tag von <zugriffszeit> vor dem End-Tag von <festplatte> stehen. Die XML-Datei computer3.xml ist daher nicht wohlgeformt. Im Gegensatz zu XML werden nicht korrekt geschachtelte HTML-Tags von den Browsern toleriert und meistens auch richtig interpretiert. Der aufmerksame Zuhörer wird bemerkt haben, dass auch in XML Leerzeichen, Tabulatoren oder leere Zeilen keinen Einfluss für die Ausgabe besitzen. Dieser Leerraum (white-space) genannte Teil der XML-Datei wird vom Parser ignoriert bzw. auf ein einziges Leerzeichen komprimiert. Ein XML-Dokument, das neben der korrekten Schachtelung der verwendeten Elemente weitere grundlegende Strukturregeln befolgt, nennt man wohlgeformt. Nur die Inhalte von wohlgeformten XML-Dateien werden vom Parser akzeptiert. XML-Dokumente, die nicht wohlgeformt sind, sollen nicht weiter bearbeitet werden. Es ist beispielsweise nicht sinnvoll, den Inhalt von solchen Dokumenten auf einem Bildschirm oder einem Drucker auszugeben. 8

1.2 Attribute Attribute sind ebenfalls von den HTML-Tags bekannt. XML-Attribute sind jedoch wiederum im Detail anders. Ihr Name kann wie die Namen der Elemente weitgehend frei und klarerweise sinnvoll gewählt werden, sodass man durch die Bezeichnung des Attributes einen klaren auf seine Bedeutung hat. Diese Freiheit bei der Namensgebung von Elementen und Attributen erfordert ein gewisses Maß an Kreativität, bietet jedoch den nicht zu unterschätzenden Vorteil, dass man durch entsprechende Sorgfalt bei der Gestaltung seiner XML-Datei einen leicht verstehbaren Text erhält. Man kann so je nach dem Verwendungszweck der XML-Datei sein eigenes Markup definieren. XML ermöglicht also das Erstellen eines semantischen Markup. Wir erweitern die XML-Datei zur Beschreibung eines Computers durch zwei Attribute. Gleichzeitig wird das Element <zugriffszeit> richtig gestellt und durch ein neues Element <kapazität> ergänzt. computer4.xml: <?xml version="1.0" encoding="iso-8859-1"?> <computer type="notebook"> <hersteller> PC-Maker </hersteller> <ram art="sdram" schaltzeit="5ns"> 128MB </ram> <festplatte> <zugriffszeit> 8ms </zugriffszeit> <kapazität> 20GB </kapazität> </festplatte> </computer> Das Element <computer> hat ein Attribut type. Das Element <ram> besitzt zwei Attribute art und schaltzeit 9

Man fragt sich mit Recht, warum die Schaltzeit der Ram-Bausteine in einem Attribut und nicht in einem Kindelement von <ram> abgelegt ist. Dies ist in diesem Beispiel auch nicht vernünftig zu argumentieren. Das Beispiel soll jedoch auf die Problematik Attribut versus Kindelement aufmerksam machen. Beim Schreiben von Attributen muss man zwei Dinge beachten. XML-Attribute haben immer einen Attributnamen und einen Attributwert. Der Attributwert muss unbedingt angegeben werden und er muss in Anführungsstrichen oder in Apostrophen eingeschlossen werden. Ähnlich wie das HTML-Tag <br> kann man auch in XML Elemente definieren, die keinen Inhalt besitzen. Solche Elemente nennt man leere Elemnte und schreibt sie mit einem Schrägstrich am Ende des Tags 2 Das wäre an und für sich sinnlos, weil ja XML-Elemente eigentlich genau den Sinn haben, entweder die Struktur zu definieren (und daher als Inhalt Kindelemente zu haben) oder eben Daten zu speichern. Wenn aber leere Elemente Attribute besitzen, sind sie so ebenfalls Träger von Information und machen daher Sinn. Zur Illustration sollen bei der Beschreibung eines Computers einige leere Elemente benutzt werden. Wie weit ihre Verwendung in diesem Beispiel tatsächlich sinnvoll ist, soll momentan dahingestellt bleiben. computer5.xml: <?xml version="1.0" encoding="iso-8859-1"?> <computer type="notebook"> <hersteller> PC-Maker </hersteller> <ram art="sdram" schaltzeit="5ns" kapazität="128mb" /> <festplatte zugriffszeit="8ms" kapazität="20gb" /> </computer> Die XML-Datei enthält dieselben Daten, aber in einer anderen Struktur. Die Ausgabe durch den Browser ist dementsprechend. 2 Ein leeres Element mit dem Namen Titel schreibt man daher in der Form <Titel/>. Es wäre aber auch die ausführlichere Schreibweise <Titel></Titel> korrekt. 10

1.3 Cascading Style Sheets (CSS) Bis jetzt haben wir uns um eine Darstellung der XML-Daten durch einen Browser in einer Form, wie wir sie von HTML-Dokumenten gewöhnt sind, überhaupt nicht gekümmert. Dies hat mindestens zwei Gründe. Auf der einen Seite sind XML-Dokumente viel allgemeiner als HTML-Dateien. HTML-Dateien besitzen praktisch keinen anderen Zweck, als eine bestimmte Information in einer durchdachten, übersichtlichen Form im WWW zu präsentieren. Die Daten, die in einer XML-Datei abgelegt sind, können hingegen auf vielfältige Art und Weise genutzt werden, nur eine davon ist ihre Darstellung im WWW. Andererseits ist die Trennung von Inhalt und Darstellung ein Grundprinzip von XML. Dies ist ja eigentlich eine logische Konsequenz dessen, dass XML-Dateien auf unterschiedlichste Art genutzt werden können. Wird der Inhalt auf einem Computermonitor dargestellt, müssen die Formatierbefehle bestimmt anders lauten, als wenn die Darstellung auf einem WAP-Handy oder in gedruckter Form erfolgt. Daher wird es zu ein und derselben XML-Datei unterschiedliche Stylesheet-Dateien geben, in denen die entsprechenden Formatierungsbefehle stehen. Grundsätzlich gibt es zwei Möglichkeiten, Inhalte einer XML-Datei für ein Ausgabemedium zu formatieren. Die Cascading Style Sheets (CSS) bieten einen einfachen, von HTML bekannten Zugang und besitzten in der Version2.0 einen äußerst umfangreichen Satz an Befehlen. Leider werden viele recht interessante CSS-Befehle von den Browsern noch immer nicht unterstützt. Noch mächtiger sind die Sprachen XSLT und XSL-FO. Diese Sprachen wurden im Gegensatz zu CSS eigens für XML-Dokumente geschaffen und erlauben es, sie für eine Vielzahl von unterschiedlichen Ausgabeformaten in einer höchst selektiven Form aufzubereiten. Es gibt auch XML-Dateien, mit denen Texte, Grafiken, Bilder oder mathematische Formeln gespeichert werden. Unterschiedliche Textverarbeitungsprogramme wie OpenOffice, KOffice oder WordPerfect verwenden bereits das XML-Format. Dieses könnte so zu einem gemeinsamen Austauschformat unterschiedlicher Textverarbeitungsprogramme werden. Hier geht es also nicht darum, die Daten der XML-Datei durch eine Transformation in ein anderes Format zu bringen. Die Daten werden in diesem Fall von einer XML-Anwendung gelesen und ausgewertet. 11

Man nennt diesen Vorgang Parsen einer XML-Datei 3. Zur Demonstration der Ausgabe von XML-Daten durch CSS wird folgende XML-Datei verwendet: jemen.xml: <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet href="jemen.css" type="text/css"?> <buch> <buchtitel> Jemen </buchtitel> <kapitel> <titel> 1) Land und Leute </titel> <abschnitt> Der vor dem Bauch getragene Krummdolch ist das Statussymbol eines jeminitischen Mannes. Er dient als Schmuck und ist allgegenwärtig. </abschnitt> <abschnitt> Die Blätter der Qatsträucher werden als moderates Rauschmittel gekaut. Diese Pflanzen wachsen nur in Höhenlagen zwischen 1000m und 2500m. </abschnitt> </kapitel> <kapitel> <titel> 2) Anreisemöglichkeiten </titel> <abschnitt> Die Anreise auf dem Landweg ist nicht empfehlenswert. Auch der Seeweg ist keine gute Altermative </abschnitt> </kapitel> 3 Wenn ein Browser eine XML-Datei einliest und anschließend grafisch darstellt, handelt es sich genau um diesen Vorgang. Das XML-Dokument wird geparst. In diesem Sinne ist jeder XML-fähige Browser eine XML-Anwendung 12

</buch> Die CSS-Befehle stehen in einer eigenen Datei jemen.css. Diese Datei wird durch eine so genannte XML-Stylesheet-Verarbeitungsanweisung in das XML- Dokument eingebunden. Sie steht unmittelbar nach der XML-Deklaration in der zweiten Zeile der XML-Datei. Ihr Inhalt besteht aus dem Namen der CSS-Datei und der Angabe, welche Art von Stylesheets diese Datei enthält. Bei der Bezeichnung der CSS-Datei sind auch Pfadangaben möglich. Dies ist insbesondere dann interessant, wenn man für seine CSS-Dateien ein eigenes Unterverzeichnis verwendet. Auch relative Pfade können angegeben werden. jemen.css: buchtitel {display: block; font-family: Arial; font-size: 20pt; text-alignment: center; color: blue; } kapitel { font-size: 12pt; font-family: Times } titel {display: block; font-size: 15pt; color: blue; } In der CSS-Datei jemen.css wird für die Elemente <kapitel>, <buchtitel> und <titel> eine Stilklasse (style sheet) definiert. Entsprechend diesen Vereinbarungen wird der Inhalt der Elemente ausgegeben. Dabei ist zu beachten, dass <titel> und <abschnitt> Kindelemente von <kapitel> sind und daher alle CSS-Befehle, die für <kapitel> definiert sind, auch für <titel> und <abschnitt> gültig sind. CSS-Befehle werden von Elternelementen auf ihre Kindelemente vererbt. Vererbte Befehle können aber durch eine eigene CSS-Regel des Kindelementes überschrieben werden. In unserem Beispiel werden daher die Inhalte der Elemente <titel> mit einer Schriftgröße von 15 Punkten dargestellt. 13

Die Eigenschaft display: block bewirkt, dass der Inhalt der Elemente mit Zeilenumbruch erfolgt. 1.4 Namensräume Bei der Verwendung von CSS-Regeln für die Ausgabe von Daten stößt man leider auf manche Grenzen, die man bei HTML nicht hat. Vertraute und oft benutzte Features wie das Erstellen von Links oder das Einbinden von Grafiken kann man bei XML in Kombination mit CSS nur mit fortgeschrittenen Techniken, die von der aktuellen Generation von Browsern nicht unterstützt wird, realisieren. Wir haben hier ein Beispiel, dass man mit den von XML im Kern zur Verfügung gestellten Fähigkeiten nicht auskommt. Dieses Problem wäre nämlich sofort gelöst, wenn man HTML-Befehle in einer XML-Datei benutzen könnte. Immer, wenn in einem XML-Dokument Elemente einer fremden Auszeichnungssprache wie eben beispielsweise HTML (oder XSL oder MathML oder XLink usw.) Verwendung finden sollen, muss ein so genannter Namensraum vereinbart werden. Dieses unglaublich mächtige Konzept soll nun anhand von HTML-Namensräumen demonstriert werden. Namensräume erweitern die Fähigkeit von XML. Mit jedem Namensraum ist eine Auszeichnungssprache assoziiert, deren Markup im XML-Dokument verwendet werden kann. Namensräume werden mithilfe des Attributs xmlns (xml-namespace) vereinbart. Dieses Attribut kann in jedem Element verwendet werden. Die Auszeichnungssprache des deklarierten Namensraumes kann in allen Kindelementen benutzt werden. Wird der Namensraum im Dokumentelement vereinbart, ist die Verwendung des entsprechenden Markups im gesamten XML-Dokument möglich. Wir erweitern die XML-Datei jemen.xml um einen HTML-Link. jemen1.xml: <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet href="jemen.css" type="text/css"?> <buch> <buchtitel> 14

Jemen </buchtitel> <kapitel> <titel>3) Politik</titel> <abschnitt>am 22.5.1990 wurde in Adan die jeminitische Republik proklamiert. </abschnitt> <abschnitt>seither ist der Jemen wieder eine politische Einheit </abschnitt> </kapitel> <kapitel> <titel>4) Wirtschaft</titel> <abschnitt>viele Jemeniten arbeiten in Saudi-Arabien als Gastarbeiter.</abschnitt> <abschnitt xmlns:html="http://www.w3.org/tr/rec-html40"> <html:a href="http:\\www.jemen.com" class="link">weitere Informationen </html:a> </abschnitt> </kapitel> </buch> Der erste Teil der XML-Datei ist unverändert und daher in komprimierter Form wiedergegeben. Der HTML-Namensraum wird erst im letzten abschnitt -Element vereinbart. Er wird für ein HTML-Link benutzt. Man beachte, dass bei der Vereinbarung des HTML-Namensraumes das Präfix html angegeben werden muss. Dieses Präfix steht dann auch verpflichtend bei jedem benutzten HTML-Tag, hier beim Anchor-Tag <a>. HTML-Tags müssen klein geschrieben werden. Bei der gleichzeitigen Verwendung mehrerer Namensräume werden durch Voranstellen der jeweiligen Präfixe Namenskollisionen vermieden. Solche Namenskonflikte wären gegeben, wenn zwei Namensräume Elemente mit denselben Namen beinhalten würden. Der Text des <html:a>-elementes muss so dargestellt werden, dass der Link als solcher auch erkannt wird. Daher wird die CSS-Datei durch folgende Regel ergänzt: {\tt.link {text-align:center text-decoration:underline } 15

Das Verwenden von HTML-Tags im XML-File widerspricht der Grundidee, dass das XML-Dokument nur strukturierte Daten enthält, aber keine Information für deren Ausgabe. Trotzdem ist die Verwendung von HTML-Namensräumen für Dokumente sinnvoll, die in erster Linie im WWW verwendet werden. Das nächste Beispiel zeigt, dass man durch die Verwendung eines HTML- Namensraumes auch die Möglichkeit bekommt, Skriptsprachen in XML-Dokumenten zu verwenden. Wir verwenden die bekannte Skriptsprache JavaScript, um das aktuelle Datum zu ermitteln. Das HTML-Tag <html:scripttype="text/javascript"> wird zweimal verwendet: einmal zum Definieren einer Funktion, die mithilfe des Date -Objektes das Datum liefert, und einmal, um diese Funktion an geeigneter Stelle im XML-Text aufzurufen. Der HTML-Namensraum wird im Dokumentelement vereinbart und umfasst daher das gesamte XML-Dokument. jemen2.xml: <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet href="jemen.css" type="text/css"?> <buch xmlns:html="http://www.w3.org/tr/rec-html40"> <html:script type="text/javascript"> function Datum(){ var date=new Date(); var monat=date.getmonth()+1; var datum=date.getdate()+"."+monat+"."+date.getyear(); alert(datum) } </html:script> <buchtitel>jemen</buchtitel> <kapitel> <titel>5) Klima</titel> <abschnitt>an der Küste hat es im Sommer und im Winter über 30 Grad.</abschnitt> <abschnitt>in den Wüstengebieten ist es genauso heiß, aber sehr trocken. </abschnitt> <abschnitt>nur in den Bergen kann man angenehme Temperaturen erwarten. </abschnitt> 16

<titel>6) Reisekleidung</titel> <abschnitt>männer und Frauen sollten möglichst viel Haut bedecken. </abschnitt> <abschnitt> <html:a href="http:\\www.jemen.com" class="link"> Weitere Informationen </html:a> </abschnitt> <abschnitt> <html:form> <html:input type="button" value="aktuelles Datum" onclick="datum()" /> </html:form> </abschnitt> </kapitel> </buch> Man beachte, dass die XML-Datei trotz dieser HTML-Einschübe noch immer wohlgeformt ist. Das HTML-Tag <html:input> ist mit XML-Augen betrachtet ein leeres Element mit drei Attributen und wird daher mit einem abschließenden Schrägstrich geschrieben. Würde man diesen Schrägstrich nicht schreiben, wäre die Datei nicht mehr wohlgeformt und der Parser würde einen entsprechenden Fehler melden. Dies ist nun nicht der Fall. 1.5 Document Type Definition (DTD) Im Folgenden beschäftigen wir uns mit XML-Dateien, bei denen es in erster Linie auf die Struktur der Inhalte ankommt. Es wurde bereits erwähnt, dass bei gemeinsam benutzten XML-Dokumenten zuerst eine bestimmte Struktur der abgelegten Daten vereinbart werden muss. Diese Struktur kann in einer so genannten Document Type Definition kurz DTD beschrieben werden. Durch diese Definition wird der Name des Dokumentenelementes festgelegt. Man nennt dies den Dokumententyp. In diesem Sinne ist der Dokumententyp der Dateien jemen.xml, jemen1.xml und jemen2.xml jeweils gleich buch. Ihre innere Struktur ist jedoch nicht ganz gleich. In je- 17

men1.xml besitzt das letzte Element vom Typ abschnitt ein Kindelement, wogegen in jemen.xml alle Elemente vom Typ abschnitt Text enthalten. Solche Differenzen erschweren die gezielte Nutzung der Inhalte einer XML-Datei. In einer DTD wird daher auch festgelegt, welche Kindelemente das Dokumentenelement hat oder haben darf und ob diese wiederum Kindelemente besitzen. Hat ein Element keine Kindelemente, so kann man bis zu einem gewissen Grad definieren, welchen Inhalt das Element haben muss. Auch Attribute werden in der DTD deklariert. Es können Werte für diese Attribute vorgegeben werden und auch hier kann man angeben, welche Werte überhaupt auftreten dürfen. Wohlgeformte XML-Dokumente, deren Struktur in dieser Form durch eine DTD beschrieben werden, werden gültig genannt. Gültige XML-Dateien können von Anwendungsprogrammen gezielt bearbeitet werden, weil eben bekannt ist, wo welche Information gefunden werden kann. Im einfachsten Fall steht die DTD im Prolog der XML-Datei unmittelbar nach der XML-Deklaration. Man spricht dann von einer internen DTD. Das erste Beispiel für eine gültige XML-Datei knüpft an die letzten Dateien an und ist durch eine interne DTD ergänzt. jemen3.xml: <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet href="jemen2.css" type="text/css"?> <!DOCTYPE buch [ <!ELEMENT buch (buchtitel?,kapitel+)> <!ELEMENT buchtitel (#PCDATA)> <!ELEMENT kapitel (titel,abschnitt*)> <!ELEMENT titel (#PCDATA)> <!ELEMENT text (#PCDATA)> ]> <buch> <buchtitel>jemen</buchtitel> <kapitel> <titel>7) Sprache</titel> <abschnitt>die Muttersprache der meisten Jeminiten ist arabisch. </abschnitt> <abschnitt>das arabische Alphabet besteht aus 28 Buchstaben, 18

die von rechts nach links geschrieben werden. </abschnitt> </kapitel> <kapitel> <titel>8) Poesie</titel> <abschnitt>worte und Dichtkunst haben ein hohes Ansehen. </abschnitt> </kapitel> </buch> Der Name des Dokumentenelementes <buch> steht bereits in der ersten Zeile direkt in der DOCTYPE-Deklaration. Dann folgt in eckigen Klammern eingeschlossen die Beschreibung der Struktur der einzelnen Elemente. In der Zeile <!ELEMENT buch(buchtitel?,kapitel+)> wird vereinbart, dass das Dokumentenelement buch Kindelemente mit den Namen buchtitel und kapitel hat. Das Fragezeichen? bedeutet, dass das Kindelement <buchtitel> entweder genau einmal auftritt oder auch fehlen kann. Das Plus + gibt an, dass mindestens ein Kindelement vom Typ Kapitel vorhanden sein muss. Nach diesen Vereinbarungen hat der Dokumenttyp buch nicht unbedingt ein Element <buchtitel>, aber auf jeden Fall ein oder mehrere Elemente <kapitel>. Durch <!ELEMENT buchtitel (#PCDATA)> wird festgelegt, dass der Inhalt des Elementes <buchtitel> beliebiger Text sein kann. Die nächste Zeile <!ELEMENT kapitel (titel,abschnitt*)> deklariert, dass jedes Element <kapitel> genau ein Kindelement <titel> und eine beliebige Anzahl von Kindelementen <abschnitt> besitzt. Die Verwendung der Symbole +, * und? ermöglicht eine gewisse Flexibilisierung. Es wäre sicher nicht sinnvoll, die genaue Anzahl der Kapitel eines Buches festzulegen. Die Bedeutung dieser Kleene-Notation wird in der Tabelle noch einmal zusammengefasst. 19

Operator Elementtyp darf auftreten? 0-mal oder 1-mal * 0-mal oder beliebig oft + 1-mal oder beliebig oft Sequenz: Die durch Beistrich getrennten Elemente müssen der Reihe nach auftreten Auswahl: Die durch einen senkrechten Strich (ODER-Operator) getrennten Elemente können nur ausschließend alternativ auftreten () Gruppierungsklammern Eine DTD enthält eigentlich die Beschreibung der inneren Struktur für eine bestimmte Klasse von XML-Dokumenten. Daher sollte beispielsweise die oben gegebene Beschreibung des Dokumenttyps buch für dutzende, ja vielleicht hunderte XML-Dokumente Gültigkeit haben. Aus diesem Grund ist es nicht sinnvoll, dass die DTD jeweils in jeder XML-Datei steht. Man lagert die Vereinbarungen der DTD in eine eigene DTD-Datei aus und spricht in diesem Fall von einer externen DTD. Im XML-Dokument verbleibt nur die DOCTYPE-Deklartion mit einer Referenz auf die verwendete DTD-Datei. Im nächsten Beispiel sehen wir, wie das konkret gemacht wird. Die Dokumentstruktur wird außerdem durch ein leeres Element <genre> ergänzt, welches ein Attribut kategorie besitzt. jemen4.xml: <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet href="jemen2.css" type="text/css"?> <!DOCTYPE Buch SYSTEM "jemen4.dtd"> <buch> <genre kategorie="reisefuehrer"/> <buchtitel>jemen</buchtitel> <kapitel> <titel>9) Fernbusse</titel> <abschnitt>busse der National verbinden die größeren Städte. </abschnitt> <abschnitt>ansonsten muss man sich Sammeltaxis organisieren, die aber nur fahren, wenn sie wirklich voll sind.</abschnitt> 20

</kapitel> <kapitel> <titel>10) Kinder</titel> <abschnitt>für viele jemenitische Kinder ist es ein beliebter Sport, bei Touristen möglichst viel abzukassieren. </abschnitt> <abschnitt>meist steckt keine echte Not dahinter</abschnitt> </kapitel> </buch> Die externe DTD steht, wie in der DOCTYPE-Deklaration angegeben, in der Datei jemen4.dtd. Diese Datei muss sich im selben Verzeichnis befinden wie die XML-Datei. Ansonsten müsste man den Dateinamen durch eine Pfadangabe ergänzen. jemen4.dtd: <!ELEMENT buch (genre,buchtitel?,kapitel+)> <!ELEMENT genre EMPTY> <!ATTLIST genre kategorie(reisefuehrer roman fachbuch) #REQUIRED> <!ELEMENT buchtitel (#PCDATA)> <!ELEMENT kapitel (titel,abschnitt*)> <!ELEMENT titel (#PCDATA)> <!ELEMENT text (#PCDATA)> In der Deklaration <!ELEMENT genre EMPTY> zeigt das Schlüsselwort EMPTY an, dass das Element genre ein leeres Element ist. In der nächsten Zeile wird das Attribut kategorie vereinbart. Es gehört zu Element genre und kann nur bestimmte Werte annehmen: reisefuehrer, roman und fachbuch. Attribute werden bei der Darstellung durch CSS nicht ausgegeben. Überhaupt merkt man an der Ausgabe der XML-Datei jemen4.xml nichts davon, dass es sich um eine gültige XML-Datei mit einer externen DTD handelt. Attribute können durch XSL ausgegeben werden. XML-Parser und XML-Anwendungen haben selbstverständlich ebenfalls Zugriff auf die Attributwerte. Im nächsten Abschnitt findet sich dazu ein Beispiel mit XSL. 21

Beim Erstellen einer DTD gibt es eine wichtige Methode: die so genannten Parameter-Entities. Mit Parameter-Entities kann man öfter wiederkehrende Textpassagen einer DTD mit einem Namen versehen und unter diesem Namen jeweils dort aufrufen, wo man sie braucht. Dies ermöglicht, längere DTDs übersichtlich zu gestalten. In unserer DTD-Datei jemen4.dtd ist dies selbstverständlich nicht notwendig. Durch ihre Kürze ist sie auf jeden Fall übersichtlich. Trotzdem soll der Einsatz der Parameterentities gezeigt werden. Der Ausdruck (#PCDATA) kommt dreimal vor und wird durch ein Parameterentity mit dem Namen text abgekürzt. Das sieht so aus: jemen5.dtd: <!ENTITY %text "(#PCDATA)"> <!ELEMENT buch (genre,buchtitel?,kapitel+)> <!ELEMENT genre EMPTY> <!ATTLIST genre kategorie(reisefuehrer roman fachbuch) #REQUIRED> <!ELEMENT buchtitel %text;> <!ELEMENT kapitel (titel,abschnitt*)> <!ELEMENT titel %text;> <!ELEMENT text %text;> Das Parameterentity text steht in der ersten Zeile der DTD. Es ist durch ein Prozent-Zeichen charakterisiert. Dann kommt der Name des Entities und schließlich folgt der in Anführungszeichen eingeschlossene Text, der durch das Entity abgekürzt werden soll. Weiter unten wird das Entity dreimal aufgerufen. Der Aufruf wird durch ein Prozentzeichen eingeleitet, dann schließt ohne Abstand der Name des Entities an. Ein Strichpunkt vervollständigt den Aufruf des Entities. 1.6 XSL Transformation (XSLT) Die Ausgabe von XML-Dateien mittels XSLT (Extensible Stylesheet Language Transformation) ist eine relativ komplexe Sache, die daher hier nur in ihren Grundzügen besprochen werden kann. XSLT ist ein mächtiges Instrument. Es wählt gewisse Elemente aus dem XML-Dokument aus und bringt ihre Information in eine bestimmte Form. 22

Angenommen, eine XML-Datei enthält Informationen zu einem Konzertzyklus. Mithilfe geeigneter XSL-Dateien werden die Informationen dieser XML-Datei benutzt, um einerseits eine HTML-Datei für das WWW zu erzeugen und andererseits ein LaTeX-File für eine Broschüre zu erstellen. Drittens könnte man eine WML- Datei für WAP-Handys oder eine PDF-Datei für das Internet mit XSL herstellen. Man sieht, XSL führt über die Möglichkeiten von CSS weit hinaus. Ähnlich wie bei CSS sind die XSLT-Befehle in einer eigenen Datei gespeichert: der XSL-Datei. Man braucht einen XSLT-Prozessor, der die Befehle der XSL-Datei interpretiert. Eine XSL-Datei erfüllt alle Anforderungen einer XML-Datei. Sie ist ebenfalls wohlgeformt und kann daher von XML-Parsern überprüft werden. Das ist ein nicht zu unterschätzender Vorteil gegenüber von CSS-Dateien. Wir erzeugen in diesem Abschnitt durchwegs HTML-Dateien, weil die eher vertraut sind und wir uns daher auf bekanntem Terrain bewegen zumindest, was das Ergebnis der Transformation betrifft. Unsere XML-Datei enthält verschiedene Daten zu afrikanischen Ländern. Wir werden diese Daten auf unterschiedlichste Weise nutzten. afrika.xml: <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet href="afrika1.xsl" type="text/xsl"?> <!DOCTYPE Buch SYSTEM "afrika.dtd"> <Laender> <Land region="nordost"> <Name>Sudan</Name> <Hauptstadt>Al-Khartum</Hauptstadt> <Groesse> <Flaeche>2 505 813qkm</Flaeche> <Einwohner>27 737 000</Einwohner> </Groesse> </Land>... <Land region="nord"> <Name>Algerien</Name> <Hauptstadt>Algier</Hauptstadt> 23

<Groesse> <Flaeche>2 381 741qkm</Flaeche> <Einwohner>29 318 000</Einwohner> </Groesse> </Land> </Laender> Ganz ähnlich wie bei der Ausgabe mit einer CSS-Datei steht am Beginn eine Verarbeitungsanweisung mit einem Verweis auf die XSL-Datei: <?xml-stylesheet href="afrika.xsl" type="text/xsl"?>. Die Datei afrika.xsl enthält also die XSL-Befehle. Sie muss sich im selben Verzeichnis befinden wie die XML-Datei. Diese arbeitet mit folgender DTD-Datei: afrika.dtd: <!ELEMENT Laender (Land)+> <!ELEMENT Land (Name,Hauptstadt,Groesse)> <!ATTLIST Land region (nord nordost ost suedost sued suedwest west nordwest) #REQUIRED> <!ELEMENT Name (#PCDATA)> <!ELEMENT Hauptstadt (#PCDATA)> <!ELEMENT Groesse (Flaeche,Einwohner)> <!ELEMENT Flaeche (#PCDATA)> <!ELEMENT Einwohner (#PCDATA)> Die erste XSL-Datei erzeugt eine Überschrift und schreibt die Namen aller Staaten untereinander auf. Sie sieht so aus: afrika1.xsl: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="html"/> <xsl:template match="laender"> <html> <head> <title>afrika</title> </head> <body> <h2>afrikanische Staaten</h2> 24

<xsl:for-each select="land"> <h4> <xsl:value-of select="name"/> </h4> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet> Der XSL-Namensraum wird direkt im Wurzelverzeichnis durch xmlns:xsl="http://www.w3.org/1999/xsl/transform vereinbart. Daher werden die XSL-Befehle in der gesamten Datei verstanden. Wie man sieht, stehen in der XSL-Datei auch HTML-Befehle. Der Grund, warum das möglich ist, ist einfach: Die XSL-Datei wird ja in eine HTML-Datei transformiert, indem die XSL-Befehle ausgeführt werden. Aus jedem XSL-Befehl wird also durch die Transformation ein oder mehrere HTML-Befehle. Jene HTML-Befehle, die von vorneherein in der XSL-Datei stehen, scheinen in der erzeugten HTML-Datei einfach unverändert auf. Als Präfix für den XSL-Namensraum muss man xsl verwenden. In der Zeile <xsl:output method="html"/> wird festgelegt, dass durch die XSL-Datei eine HTML-Datei erzeugt werden soll. Nun wird durch den Befehl <xsl:template match="laender"> ein so genanntes template auf das Dokumentelement <Laender> angewendet. Durch dieses Template werden alle am Element <Laender> hängenden Kindelemente, in diesem Fall also alle Elemente der XML-Datei, in Form eines Baumes abgebildet und man erhält so einen Zugriff auf deren Inhalte. Unsere XML-Datei besitzt einen Baum mit 4 Ebenen. Die Wurzel des Baumes bildet das Dokumentelement <Laender>. In der nächsten Ebene befinden sich die Kindelemente von <Laender>, die Elemente <Land>. Deren Kindelemente <Name>, <Hauptstadt> und <Groesse> befinden sich in der dritten Ebene des Baumes. Die vierte Ebene wird von den Kindelementen von <Groesse> gebildet: von <Einwohner> und <Flaeche>. Bereits dieses erste Beispiel zeigt deutlich die grundlegende Technik von XSL: Es werden bestimmte Elemente aus dem XML-Dokument ausgewählt und ihre Infor- 25

mation wird dazu benutzt, eine HTML-Datei mit bestimmten, gewünschten Eigenschaften zu erzeugen. Bei CSS entspricht die Struktur der Ausgabe meist der in der XML-Datei vorhandenen Struktur. XSL kann Dokumente erzeugen, deren Struktur völlig verschieden von der Struktur der XML-Datei ist. Baumstrukturen sind ein in der Informatik unglaublich wichtiges und leistungsfähiges Konzept. Für XML haben sie eine ganz spezielle Bedeutung. So bedeuten die Forderungen an eine wohlgeformte XML-Datei im Wesentlichen nichts anderes, als dass ihre Elemente einen Baum bilden. Der nächste Abschnitt wird dieses Thema etwas genauer behandeln. Die Elemente des XML-Dokumentes aftika.xml bilden folgende Baumstruktur 4. Laender / \ Land Land Land / \ / \ / \ Name Hauptstadt Groesse Name Hauptstadt Groesse Name Hauptstadt Groesse / \ / \ / \ Flaeche Einwohner Flaeche Einwohner Flaeche Einwohner Nach dem Erzeugen des Templates kommen einige reine HTML-Zeilen, die den ersten Teil der HTML-Datei bilden. Der XSL-Befehl <xsl:for-each select="land">... </xsl:for-each> erzeugt innerhalb seines Start- und End-Tags eine Schleife, in der alle durch das Attribut select ausgewählten Elemente in der Reihenfolge, in der sie in der XML- Datei stehen, durchlaufen werden. In unserem Fall werden daher alle Elemente vom Typ Land der Reihe nach von dieser Schleife angesprochen. Innerhalb der Schleife steht der Befehl <xsl:value-of select="name"/>. Er liefert den Inhalt des selektierten Elementes, hier also den Namen des betreffenden Staates. Dieser wird als Überschrift der Hierarchie <h4> ausgegeben. Der Quelltext der HTML-Datei zeigt sehr schön die genaue Wirkung der XSL- Befehle: <html> <head> 4 Natürlich besteht die XML-Datei aus mehr als drei Elementen Land. Für die Darstellung der Baumstruktur sind jedoch drei Elemente sicher ausreichend 26

<META http-equiv="content-type" content="text/html; charset=utf-16"> <title>afrika</title> </head> <body> <h2>afrikanische Staaten</h2> <h4>sudan</h4> <h4>angola</h4> <h4>ägypten</h4> <h4>äthiopien</h4> <h4>botswana</h4> <h4>dschibuti</h4> <h4>eritrea</h4> <h4>algerien</h4> </body> </html> In der nächsten XSL-Datei wird gezeigt, dass man durch die wiederholte Anwendung von Templates dieselbe Wirkung wie mit einem <for-each>-befehl erzielen kann. Diese Technik reflektiert auch deutlich die Baumstruktur des XML- Dokumentes. afrika2.xsl: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="html"/> <xsl:template match="laender"> <html> <head> <title>afrika</title> </head> <body> <h2>afrikanische Staaten</h2> <xsl:apply-templates select="land"/> </body> </html> </xsl:template> 27

<xsl:template match="land"> <h4> <xsl:apply-templates select="name"/> </h4> </xsl:template> <xsl:template match="name"> <xsl:value-of select="."/> </xsl:template> </xsl:stylesheet> Bitte beachten Sie, dass man die Stylesheet-Anweisung in der XML-Datei afrika.xml entsprechend abändern muss, damit die Befehle von afrika2.xsl wirksam werden können. Die ersten Zeilen stimmen noch mit der vorigen XSL-Datei überein. Im body - Teil stehen jetzt aber nur zwei Befehle: <h2>afrikanische Staaten</h2> <xsl:apply-templates select="land"/> Der erste Befehl schreibt die Überschrift. Der XSL-Befehl erzeugt ein Template für das ausgewählte Element <Land> Die XML-Datei hat jedoch mehrere Elemente vom Typ Land. Daher wird tatsächlich der Reihe nach für jedes einzelne Element <Land> ein Template erzeugt. Anschließend wird mit diesem Template das durchgeführt, was zwischen <xsl:template match="land"> und </xsl:template> steht. Hier befinden sich die HTML-Tags <h4> und </h4>, die den XSL-Befehl <xsl:apply-templates select="name"/> einschließen. Dieser erzeugt ein neues Template für das Kindelement <Name>. In diesem Template wird mit <xsl:value-of select="."/> der Inhalt des Elementes <Name> ausgegeben. Der aktuelle Knoten des Elementbaumes wird durch "." selektiert. ".." würde das übergeordnete Elternelement selektieren. Die Wirkung ist insgesamt dieselbe wie bei der letzten XSL-Datei: Es werden die Namen der einzelnen Länder in der Reihenfolge, in der sie in der XML-Datei 28

stehen, ausgegeben. Die erzeugte HTML-Datei ist vollkommen identisch mit der oben angegebenen. Bei den nächsten Beispielen wird der HTML-Quelltext der erzeugten HTML-Datei nicht mehr wiedergegeben. Die XSL-Datei afrika3.xsl benutzt wieder nur ein einziges Template, welches den gesamten Elementenbaum der XML-Datei abbildet. Wie in der ersten XSL-Datei sorgt der Befehl <xsl:for-each select="land"> dafür, dass eine Schleife über alle Elemente <Land> gebildet wird. Nun steht allerdings der Sortierbefehl <xsl:sort select="name"/>, der dafür sorgt, dass die Elemete vom Typ Land alphabetisch sortiert nach dem Eintrag des Elementes <Name> durchlaufen werden. Daher ist die erzeugte Tabelle alphabetisch sortiert. Die value-of -Befehle liefern wieder die eigentlichen Eintragungen der Liste. Sie sind jeweils von den HTML- Tags <span> umschlossen. Diese erlauben es, in HTML semantische Einheiten zu bilden. Hier werden sie benutzt, um über das Style-Attribut Formatierungen für die Ausgabe festzulegen. In jeder Zeile der Tabelle werden Name, Einwohnerzahl und Flächeninhalt der einzelnen Länder ausgegeben. afrika3.xsl: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="html"/> <xsl:template match="laender"> <html> <head> <title>afrika</title> </head> <body> <h2>afrikanische Staaten</h2> <h4>(verkehrt alphabetisch sortiert)</h4> <table border="2" STYLE="border-style:outset"> <tr style="font-weight:bold; font-size:16pt;"> <td><b>staat</b></td> <td><b>einwohner</b></td> <td><b>flaeche</b></td> 29

</tr> <xsl:for-each select="land"> <xsl:sort select= -Name /> <tr> <td> <span STYLE="font-size:15pt"> <xsl:value-of select="name"/> </span> </td> <td align="right"> <xsl:value-of select="groesse/einwohner"/> </td> <td align="right"> <xsl:value-of select="groesse/flaeche"/> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Der oben wiedergegebene Code von afrika3.xsl zeigt deutlich, dass XSL-Dokumente wohlgeformt sein müssen. Im Gegensatz zu DTD-Dateien oder CSS-Dateien gehorchen sie also denselben Spielregeln wie XML-Dokumente. Beachten Sie die Selektion der Elemente bei den value-of -Befehlen. Mit select="name" wird ein Element der nächsten Ebene ausgewählt. Wir befinden uns an dieser Stelle innerhalb der for-each Schleife. Daher ist eines der Land -Elemente das aktuell gültige, selektierte Element und die Befehle in der Schleife werden relativ zu diesem Element ausgewertet. Mit select="groesse/einwohner" und select="groesse/flaeche" werden hingegen Elemente aus der übernächsten Ebene ausgewählt. Die restlichen Befehle sind HTML: <tr> erzeugt eine neue Zeile in der Tabelle, <td> einen neuen 30

Tabelleneintrag. Die nächste XSL-Datei erzeugt ebenfalls eine Tabelle. Zur Abwechslung und damit man die Techniken vergleichen kann, wird nun kein Schleifenbefehl verwendet. Es werden wieder wie in afrika1.xsl wiederholt Templates erzeugt. Daher ist die Ausgabe in der Tabelle auch nicht sortiert. Nun wird erstmals der Wert des Attributs region ausgelesen und in der zweiten Spalte der Tabelle ausgegeben. Mit CSS ist eine Ausgabe von Attributwerten nicht möglich. Attributwerte können in CSS nur bei der Auswahl der Elemente, die für eine bestimmte CSS-Regel angewendet werden soll, eine Rolle spielen. afrika4.xsl: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="html"/> <xsl:template match="laender"> <html> <head> <title>afrika</title> </head> <body> <h2>afrikanische Staaten</h2> <h4>(unsortiert)</h4> <table border="2" STYLE="border-style:outset"> <tr style="font-weight:bold;font-size:16pt;"> <td><b>staat</b></td> <td><b>region</b></td> <td><b>einwohner</b></td> <td><b>flaeche</b></td> </tr> <xsl:apply-templates select="land"/> </table> </body> </html> </xsl:template> <xsl:template match="land"> 31

<tr> <xsl:apply-templates select="name"/> <td align="right"> <xsl:value-of select="@region"/> </td> <xsl:apply-templates select="groesse"/> </tr> </xsl:template> <xsl:template match="name"> <td> <span STYLE="font-size:15pt"> <xsl:value-of select="."/> </span> </td> </xsl:template> <xsl:template match="groesse"> <td align="right"> <xsl:value-of select="einwohner"/> </td> <td align="right"> <xsl:value-of select="flaeche"/> </td> </xsl:template> </xsl:stylesheet> Die XSL-Datei ist übersichtlich strukturiert. Im Template Land wird zuerst mit <xsl:apply-templates select="name"/> ein Template für das Kindelement <Name> aufgerufen. Dieses Template erledigt den ersten Tabelleneintrag. Anschließend wird durch <xsl:value-of select="@region"/> der Wert des Attributes region ausgelesen und als zweiter Eintrag in die Tabelle geschrieben. Der Wert eines Attributes wird durch ein vorangestelltes Klammeraffe-Zeichen an- 32

gesprochen. Dazu muss das Element, zu dem das Attribut gehört, selektiert sein. Dies ist in unserem Beispiel das Element <Land> Der Aufruf <xsl:apply-templates select="groesse"/> erledigt schließlich die restlichen beiden Eintragungen für die Einwohnerzahl und den Flächeninhalt des Landes. 1.7 Baumstruktur Daten serialisieren Die Baumstruktur einer XML-Datei kann nicht so ohne weiteres auf einem Datenträger gespeichert werden. Während ein Programm einen Dokumentbaum mit geeigneten Algorithmen auf vielfältige Weise abarbeiten kann, muss eine Datei auf ein Trägermedium sequentiell geschrieben werden. Die Daten eines XML-Baumes müssen also serialisiert werden. Genau dies ist mit den schon besprochenen Merkmalen einer XML-Datei besonders einfach zu lösen: Beginnend mit dem öffnenden Tag des Wurzelelementes werden der Reihe nach alle Elemente der obersten Ebene, die so genannten Top-Level-Elemente gespeichert. Verzweigungen in der Baumstruktur bedingen, dass die Top-Level-Elemente weitere Elemente beinhalten. Jede Verzweigung des Baumes bedingt, dass ein Element Kindelemente besitzt. 5 Bevor das schließende Tag eines Elementes geschrieben wird, müssen also alle Kindelemente gespeichert werden. Sollte eines dieser Kindelemente Kinder haben, so wird auf die gleiche Weise verfahren. Erst wenn alle Nachfahren eines Top-Level-Elementes gepeichert worden sind, wird das öffnende Tag des nächsten Top-Level-Elementes geschrieben usw. Sind alle XML-Elemente auf die obige Weise gespeichert, so liegt notwendigerweise eine wohlgeformte XML-Datei vor. Umgekehrt kann nur eine wohlgeformte XML-Datei in einen XML-Baum eingelesen werden. Dieses Deserialisieren übernimmt beispielseweise ein XML-Parser, wenn eine XML-Datei aufgerufen wird. Eine besondere Bedeutung hat das Serialisieren von Daten im Zusammenhang mit den im letzten Abschnitt behandelten Transformationen. Wie zu sehen war, werden dabei zwei XML-Dateien verwendet: In der so genannten Eingabedatei sind die XML-Daten enthalten, die die Grundlage für die geplanten Transformationen bilden. Diese Eingabedatei muss zunächst in den so genannten Eingabebaum deserialisiert werden. Danach wird die Transformationsdatei, die ebenfalls eine wohlgeformte XML-Datei sein muss, in den Transformationsbaum eingelesen, der alle 5 Besitzt ein Element nur ein einziges Kindelement, so liegt zwar keine Verzweigung im eingentlichen Sinne vor, aber die Verbindung zwischen Elternelement und Kindelement bedingt einen so genannten Knoten. 33

vorgesehenen Transformationen enthält. Nach der Transformation liegt das Ergebnis im so genannten Ergebnisbaum (Zielbaum) vor. XML-Daten können bei der Transformation in verschiedene Ausgabeformate serialisiert werden. Zurzeit ist es möglich, XML-Daten in eine Textdatei, in eine HTML-Datei oder eine XML-Datei zu serialisieren. Dabei ist zu beachten, dass etwa im Fall der Ausgabe in eine Textdatei der Ergebnisbaum nicht mehr wohlgeformt sein muss. Mit XSL-FO ist es möglich, XML-Daten in PDF-Dokumente zu serialisieren, die mit herkömmlichen PDF-Viewern angezeigt werden können. Während im DOM (Document Object Model) die gesamte Baumstruktur einer XML-Datei im Speicher abgebildet wird, durchläuft SAX (Simple Acces for XML) alle Elemente einer XML-Datei genau einmal. Das Serialisieren von XML-Baumstrukturen ist nicht nur zum Speichern der Daten auf dem Datenträger wichtig. Allgemein müssen XML-Daten auf irgendeinem Weg von einem Rechner auf einen anderen übertragen werden, ohne dass die Daten dazwischen physikalisch auf einen Datenträger geschrieben werden. Dies ist ebenfalls nur in serialisierter Form, in so genannten Datenströmen möglich. Jedenfalls muss sichergestellt sein, dass der sendenden und der empfangenden Anwendung die Datenstruktur gleichermaßen bekannt ist. 1.8 XML-Anwendungen In der relativ kurzen Zeit seit des Bestehens der XML-Spezifikation wurden zahlreiche Anwendungen entwickelt. Einige davon wurden in den vergangenen Abschnitten bereits genannt: So stellen XSLT (extended Stylesheet Language Transformations) oder XSL-FO (extended Stylesheet Language Formatting Objects) XML- Anwendungen dar. XML-Schema legt unter Verwendung des XML-Protokolls genaue Datenstrukturen für XML-Dokumente fest. Aus den Medien sind wahrscheinlich eine Reihe weiterer Anwendungen bekannt, die auf dem XML-Datenformat aufbauen. In der folgenden Tabelle sind einige davon aufgeführt und kurz beschrieben: 34

XML-Anw. CML MathML RDF SMIL SOAP SSMLS SVG VoiceXML WDDX WML XHTML XML-RPC Beschreibung Chemical Markup Language. Dient zur Darstellung von chemischen Formeln Mathematical Markup Language. Dient zur Beschreibung und Formatierung mathematischer Ausdrücke und Formeln. Wird beispielsweise für den Formelsatz in Textverarbeitungsprogrammen verwendet (z.b. StarOffice, OpenOffice, Koffice) Resource Description Framework. Legt eine Beschreibungsprache für Dokumente allgemein fest Synchronized Multimedia Integration Language. Dient zur vereinheitlichten Beschreibung von multimedialen Präsentationen Simple Object Access Protocol. Dient zur Übertragung von Daten zwischen SOAP-Sender und SOAP-Empfänger auf der Basis von HTTP Speech Synthesis Markup Language Specification. Gibt eine XML-basierte Beschreibung von Elementen für Voice-Browser an. Scalable Vector Graphics. Erlaubt die Beschreibung zahlreicher Vektorgrafikobjekte Voice extensible Markup Language. Beschreibt die Benutzer-Interaktion mittels Sprachausgabe und Spracheingabe Web Distributed Data exchange. Ermöglicht den Datenaustausch auf der Basis von HTTP. Wireless Markup Language. Dient zur Darstellung von Informationen für Mobiltelefone und PDAs Extensible HyperText Markup Language. Stellt eine XML-konforme Weiterentwicklung von HTML 4.0 dar XML Remote Procedure Calls. Erlaubt Funktionsaufrufe auf entfernten Systemen 35