Bei HTML steht ein festgelegter Vorrat an Auszeichnungen zur Verfügung. Manche sind optisch: zum Beispiel <i>, <strong>, <font>. Manche sind inhaltlich, zum Beispiel <address>, <h1>. Der Web-Browser legt fest, wie die Elemente genau angezeigt werden (zum Beispiel ist Fettschrift in der Standardeinstellung von Lynx unterstrichen).
Eine inhaltliche Auszeichnung lässt sehr viel mehr Information über die Struktur eines Dokuments transparent erscheinen. Wenn man zum Beispiel alle Personennamen, die in einem Dokument vorkommen, mit <name>Hugo Habicht</name> als solche auszeichnet, können sie im gedruckten Dokument als Kapitälchen angezeigt werden, gleichzeitig kann man mit einem Programm alle Namen in ein Namensregister packen.
Ein Satz syntaktisch kann sein inkorrekt, obwohl richtige enthält nur Wörter.
Ein Satz kann syntaktisch völlig korrekt sein und gleichzeitig ein nicht im Duden auffindbares Brömel enthalten.
Wir können die beiden obigen Sätze verstehen, Computer sind da weniger fehlertolerant. Die rigide syntaktische Vorschrift von XML erlaubt, mit wenig Aufwand die syntaktische Korrektheit ("Wohlgeformtheit") zu überprüfen. Eine tiefergehende Beschreibung der Grammatik und des Zeichenvorrates einer Dokumentenklasse wird durch die Document Type Definition (DTD) festgelegt.
Zum Beispiel ist HTML eine DTD innerhalb von SGML.
Ein XML-Dokument ist gültig, wenn es wohlgeformt ist und den Regeln seiner zugehörigen DTD entspricht.
<!-- DTD for Shakespeare J. Bosak 1997.01.02 --> <!ENTITY amp "&"> <!ELEMENT play (title, fm, personae, scndescr, playsubt, induct?, prologue?, act+, epilogue?)> <!ELEMENT title (#PCDATA)> <!ELEMENT fm (p+)> <!ELEMENT p (#PCDATA)> <!ELEMENT personae (title, (persona | pgroup)+)> <!ELEMENT pgroup (persona+, grpdescr)> <!ELEMENT persona (#PCDATA)> <!ELEMENT grpdescr (#PCDATA)> <!ELEMENT scndescr (#PCDATA)> <!ELEMENT playsubt (#PCDATA)> <!ELEMENT induct (title, subtitle*, (scene+|(speech|stagedir|subhead)+))> <!ELEMENT act (title, subtitle*, prologue?, scene+, epilogue?)> <!ELEMENT scene (title, subtitle*, (speech | stagedir | subhead)+)> <!ELEMENT prologue (title, subtitle*, (stagedir | speech)+)> <!ELEMENT epilogue (title, subtitle*, (stagedir | speech)+)> <!ELEMENT speech (speaker+, (line | stagedir | subhead)+)> <!ELEMENT speaker (#PCDATA)> <!ELEMENT line (stagedir | #PCDATA)+> <!ELEMENT stagedir (#PCDATA)> <!ELEMENT subtitle (#PCDATA)> <!ELEMENT subhead (#PCDATA)>
Das Beispiel sieht verwirrend aus, löst sich aber, wenn man es Schritt für Schritt durchgeht und sich klar macht, welche Elemente was enthalten können.
Es existieren Entities und Elements. Entities sind feste Zeichen oder Zeichenfolgen. So löst sich & in das & auf, da es durch die Entity-Deklaration so vereinbart wurde.
#PCDATA können auch auf einem Server abgespeichert werden :-). Sie stehen für "parseable character data". Ihr Gegenstück sind Binärdaten, die vom XML-Parser nicht weiter interpretiert werden sollen. Sie werden durch #NDATA bezeichnet.
Elemente können andere Elemente enthalten. Entities, #NDATA und #PCDATA können nichts mehr enthalten.
In einer Elementdefinition können folgende syntaktische Ausdrücke enthalten sein:
Die DTDs sind syntaktisch von SGML her übernommen. Natürlich lassen sich Dokumentgrammatiken auch selbst in einer Beschreibungssprache wie XML entwerfen. Eine in XML geschriebene Strukturvorschrift heißt XML-Schema.
UmwandlungswerkzeugIm Gegensatz zur ereignisbasierten Interpretation von XML-Dokumenten (simple API to XML (SAX)) ist das Document Object Model (DOM) an der Baumstruktur orientiert.
Dies bedeutet, dass das Dokument als Ganzes eingelesen werden muss, bevor es interpretiert werden kann. Dafür kann es flexibel bearbeitet werden.
Das Modul XML::DOM entwickelt eine Baumstruktur aus dem Originaldokument. Mit ihr kann man flexibel auf einzelne Ecken des Graphen zugreifen.
Die Aufgabe soll nun darin bestehen, mit Hilfe von XML::DOM einen Rollenauszug aus einem Drama zu basteln, in dem nur die Auftritte und Sprechrollen einer einzigen dramatischen Person herausgezogen wird und der Rest des Textes gelöscht werden. Nur die letzte Zeile des vorhergehenden Parts soll als Erleichterung des Einsatzes mit herausgegeben werden.
Eine Verwirklichung mit Hilfe von Perl ist nicht allzu schwer.
Mit der Baumstruktur vor Augen, kann man natürlich sehr vielfältige Ausgaben produzieren, zum Beispiel eine Umwandlung in ein TeX-Dokument. Ein Programm kann alle Ecken durchlaufen und Formatieranweisungen abhängig von den Kindern und Eltern der aktuellen Ecke herausschreiben.
Speziell kann so die Trennung von Inhalt und Form vorgenommen werden, was ein immenser Vorteil ist. Man kann sich verschiedene Routinen schreiben, die Ausgaben in Richtung HTML, RTF, texinfo, in SMS-gerechte Portionen oder was auch immer leisten.
Der Nachteil an diesem Ansatz (aus Perls Paket XML::DOM heraus zu arbeiten) ist, dass man von der Implementierungssprache anhängig ist. Ein Web-Designer, der die Formatanweisungen schreibt, müsste sich an eine passende Programmiersprache (die vielleicht die Datenbank im Hintergrund verwaltet) halten.
Daher wurde (und wird!) eine eigene Sprache entwickelt, die diese Formatierungsanweisungen beschreibt, die Extensible Style Language (XSL). Auf diese Weise ist eine Trennung zwischen Form, Inhalt und Implementation gegeben. Die Umsetzung in die passenden Formate muss von Programmiersprachen geleistet werden. In Perl tut dies das Paket XML::XSLT. Die Formatierungen finden bei dynamischen Webseiten in der Regel auf seiten des Servers statt.
Aus Zeitgründen soll nicht näher auf XLS eingegangen werden. Als Beispiel, wie das Ergebnis einer Umwandlung eines XML-Dokuments in HTML aussieht, können die anliegenden Dateien dienen. Die XSL-Datei ist jedoch schnell zusammengestoppelt und nur zu Demonstrationszwecken, wie so etwas im Prinzip funktioniert, zu gebrauchen. Ausführlichere Tutorien findet man auf Deutsch bei der iX-Redaktion und auf Englisch bei Norman Walsh zu bekommen.