XMLidP2000

Sitemap

Sitemap

1 Einführung
1.1 Warum mehr weniger ist
1.2 Warum mehr mehr ist
1.3 Wohin die Reise geht
2 Was sind Dokumente?
2.1 Eine kurze Geschichte der Textverarbeitung
2.2 Bestandteile eines Dokumentes
2.3 Die neue, alte Idee: Strukturorientiert schreiben
2.4 Die Entwicklung des Hypertextes
2.5 Textformate im Web
2.6 Das SGML-Konzept: Generic Markup
2.7 Dokumente versus Daten
3 XML im Web
3.1 XML bei der Verwaltung von Websites
3.2 Clientseitige XML-Interpretation
3.2.1 XML mit CSS
3.2.2 XML mit XSL(T)
3.3 XML auf dem Server
3.4 Linking-Möglichkeiten von XML
3.5 XML als Datenaustauschformat
4 XML Quick Start
4.1 Dokumenttyp-Definition (DTD) und Instanzen
4.2 Verarbeitung der Dokumente
4.2.1 Beispiel: Verarbeitung mit Cost/TCL
4.2.2 Beispiel: Verarbeitung mit XSLT
4.2.3 Beispiel: XML/XSLT im Internet Explorer
4.2.4 Fazit
5 XML-DTDs: Die verständliche Beschreibung
5.1 Ein Wort zur Notation
5.2 Dokumente
5.3 Elemente
5.4 Zeichen, Namen und Zeichendaten
5.5 Kommentare
5.6 Processing Instructions
5.7 Wo bleibt Multimedia?
5.8 Dokumenttyp-Definition (DTD)
5.8.1 Elementtyp-Deklaration
5.8.2 Attributlisten-Deklaration
5.8.3 Möglichkeiten, die DTD zu gestalten und zu gliedern
5.8.4 Notation-Deklaration
6 Namensräume in XML
7 XPath: Adressierung von XML-Dokumentteilen
7.1 Zu Grunde liegendes Datenmodell
7.2 Zugriff auf den Datenbaum
7.3 Hilfe von Operatoren
7.4 Kernfunktionen für den Datenzugriff
8 XML: Linking
8.1 Notwendige Begriffe
8.2 XLink: einfache und erweiterte Links
8.2.1 Einfache Verweise
8.2.2 Erweiterte Links
8.2.3 XLink in der Praxis
8.3 XPointer: Verweise in Dokumente hinein
8.3.1 XPath-Erweiterungen in XPointer
9 Überblick über Stylesheet-Sprachen
9.1 Cascading Style Sheets
9.1.1 Wertzuweisungen
9.1.2 Formatierungsmodell
9.1.3 CSS und XML
9.1.4 Ein Beispiel: XML im Mozilla
9.2 Document Style Semantics and Specification Language
9.2.1 Flow Objects
9.2.2 Verarbeitungs-Modus
9.2.3 DSSSL praktisch
9.2.4 Langer Marsch von DSSSL nach HTML
9.3 Extensible Stylesheet Language (XSLT und XSL)
9.3.1 Verhältnis von XSLT zu XSL
9.3.2 Formatierung mit XSL
10 XSL-Transformationen
10.1 Grundsätzliches über Templates
10.2 Ergänzungen zum Datenmodell von XPath
10.3 Struktur von XSLT-Stylesheets
10.4 Den Ergebnisbaum erzeugen
10.4.1 Diverse Basiselemente
10.4.2 Formatierte Nummerierung
10.4.3 Schleifen und bedingte Verarbeitung
10.4.4 Sortieren
10.4.5 Variable und Parameter
10.4.6 Zusätzliche Funktionen
10.4.7 XSLT-Erweiterungen
10.4.8 message, output
11 XSLT in Web-Anwendungen
11.1 XSLT im Internet Explorer
11.2 Linklisten erzeugen
11.3 Details einer Literaturgeschichte
11.3.1 Sortierte Überblicksseiten
11.3.2 Kalender: einzelne Tage ausgeben
12 XML-Editoren
12.1 Übersicht
12.1.1 Emacs + PSGML (mit XML-Unterstützung)
12.1.2 XML Notepad
12.1.3 XML Spy
12.1.4 XMetal
12.1.5 Epic
12.1.6 MarkupKit (für MS Word)
12.1.7 WordPerfect Office2000
12.2 Emacs und PSGML (mit XML-Unterstützung)
12.3 XML-Notepad
12.4 XML Spy
12.5 XMetal
12.6 Epic
12.7 MarkupKit (für MS Word)
12.8 WordPerfect Office2000
12.9 Fazit
13 Entwicklung einer DTD
13.1 Auswahl einer Mehrzweck-DTD
13.2 Entwurf einer DTD
13.2.1 Dokumentanalyse
13.2.2 Tipps und Tricks
13.3 Instanzen ohne DTD
14 Herstellung dieses Buches
14.1 Zielsetzung und Randbedingungen
14.2 Definition der DTD
14.2.1 Schritt 1: Die Grobstruktur
14.2.2 Schritt 2: Elemente auf Zeichenebene
14.2.3 Schritt 3: Die Details
14.3 Formatieren des Manuskriptes
14.3.1 Konvertierung in HTML
14.3.2 Aufbereitung für den Ausdruck
14.4 Erfahrungen mit der zweiten Auflage
15 Anwendungsbeispiel Literatur
15.1 Vorüberlegungen
15.2 En détail: die Autoren in der DTD
15.3 Wie die Daten ins Web gelangen
15.3.1 Inhaltsverzeichnis generieren
15.3.2 Ausgabe der Autorendaten
15.4 Vollständige Listings
15.4.1 DTD für die Literaturgeschichte
15.4.2 DSSSL-Listing: Inhaltsverzeichnis
15.4.3 DSSSL-Listing: Ausgabe eines einzelnen Autors
15.4.4 Perl-Code für Ausgabe einzelner Autoren
16 Verteilte Softwareverwaltung mit XML
16.1 Aufgabenbeschreibung
16.2 XML als Datenbasis
16.3 Bilden von DTD-Hierarchien
16.4 Zusammentragen von verteilten XML-Fragmenten
16.5 Fazit
16.6 Stylesheet zur Transformation in HTML
17 E-Commerce mit XML
17.1 B2B-E-Commerce
17.1.1 Die Rolle von XML
17.1.2 Technische Aspekte
17.2 BMEcat
17.3 Electronic Business XML (ebXML)
17.3.1 Arbeitsgruppen
17.3.2 Zeitplan des Projekts
17.4 XML und EDIFACT
18 XML und Apache
18.1 XML-Transformation per CGI
18.1.1 Konfiguration des Servers
18.1.2 CGI-Skript: xmlhandler.cgi
18.1.3 Beispiel: von HTML nach HTML mit DSSSL oder XSLT
18.2 Cocoon
18.2.1 Extensible Server Pages (XSP)
18.2.2 Beispiel: Formatierung in PDF mit XSL
18.2.3 Beispiel: Simuliertes XLink mit Dynamic HTML/JavaScript
18.2.4 Installation
19 XHTML: Neues HTML 4 — erweiterbar
19.1 Status quo: HTML neu definiert
19.2 Modulare Zukunft
20 Transformation von XML in WML und HTML
20.1 Erzeugen der WML-Dateien
20.2 Erzeugen der HTML-Dateien
21 Ausblick
21.1 XML Schema
21.2 Programmierung mit XML-Daten
21.3 XML und Java
21.4 Resource Description Framework
21.5 Die Zukunft
A Extensible Markup Language (XML) 1.0
A.1 Einleitung
A.1.1 Herkunft und Ziele
A.1.2 Terminologie
A.2 Dokumente
A.2.1 Wohlgeformte XML-Dokumente
A.2.2 Zeichen
A.2.3 Allgemeine syntaktische Konstrukte
A.2.4 Zeichendaten und Markup
A.2.5 Kommentare
A.2.6 Processing Instructions
A.2.7 CDATA-Abschnitte
A.2.8 Prolog und Dokumenttyp-Deklaration
A.2.9 Standalone-Dokumentdeklaration
A.2.10 Behandlung von Leerraum
A.2.11 Behandlung des Zeilenendes
A.2.12 Identifikation der Sprache
A.3 Logische Strukturen
A.3.1 Start-Tags, End-Tags und Leeres-Element-Tags
A.3.2 Elementtyp-Deklarationen
A.3.3 Attributlisten-Deklaration
A.3.4 Bedingte Abschnitte
A.4 Physikalische Strukturen
A.4.1 Zeichen- und Entity-Referenzen
A.4.2 Entity-Deklarationen
A.4.3 Analysierte Entities
A.4.4 Behandlung von Entities und Referenzen durch einen XML-Prozessor
A.4.5 Konstruktion des Ersetzungstextes von internen Entities
A.4.6 Vordefinierte Entities
A.4.7 Notation-Deklarationen
A.4.8 Dokument-Entity
A.5 Konformität
A.5.1 Validierende und nicht-validierende Prozessoren
A.5.2 Benutzen von XML-Prozessoren
A.6 Notation
A.7 Anhang A: Referenzen
A.7.1 Normative Referenzen
A.7.2 Weitere Referenzen
A.8 Anhang B: Zeichenklassen
A.9 Anhang C: XML und SGML (nicht normativ)
A.10 Anhang D: Expansion von Entity- und Zeichenreferenzen (nicht normativ)
A.11 Anhang E: Deterministische Inhaltsmodelle (nicht normativ)
A.12 Anhang F: Automatische Erkennung von Zeichenkodierungen (nicht normativ)
A.13 Anhang G: XML-Arbeitsgruppe des W3C (nicht normativ)
B Verknüpfen von Style Sheets mit XML-Dokumenten Version 1.0
B.1 Die xml-stylesheet-Processing-Instruction
B.2 Anhang A: Referenzen
B.3 Anhang B: Begründung
C Verhältnis von XML zu SGML und HTML
C.1 XML und SGML
C.2 XML und HTML
D Übersichten
D.1 Cascading Style Sheets
D.1.1 CSS-Eigenschaften und -Werte
D.1.2 CSS-Muster
D.2 DSSSL: Flow Objects
D.3 Syntax der XSLT-Elemente
D.4 DTD-Fragment für XSLT-Stylesheets (nicht normativ)
D.5 Relevante Spezifikationen und Organisationen
D.5.1 International Organization for Standardization
D.5.2 World Wide Web Consortium
D.5.3 Organization for the Advancement of Structured Information Standards
D.5.4 Internet Society und Internet Engineering Task Force
D.5.5 ISO-639-Sprachcodes
D.5.6 ISO-3166-Ländercodes
D.5.7 Zeichensatz ISO-Latin-1
D.5.8 Sonderzeichen
D.6 XML-1.0-Regeln

13.2.2 Tipps und Tricks

In diesem Abschnitt diskutieren wir einige der häufigsten Probleme, denen sich der DTD-Designer gegenübergestellt sieht.

Benennung der Elementtypen
Elementtypen:Benennung der Es mag auf den ersten Blick seltsam erscheinen, dass wir hier die Namen der Elementtypen diskutieren. Wie das Sprichtwort sagt, Namen sind Schall und Rauch. Aus Sicht des Computers ist das sicherlich richtig; ihm ist es egal, welchen Namen ein Elementtyp besitzt. Aber da immer noch Menschen die Texte schreiben, ist es sinnvoll, sprechende Namen zu verwenden. Dies ist letzlich auch die Idee des Generic Markup, die wir am Anfang des Buches als eine Motivation genannt haben.

Für einfache, konkrete Faustregeln zur Bildung von Elementnamen machen wir folgende Vorschläge:

Tipp

Diese Regeln sind nicht für alle Anwendungen geeignet. Insbesondere bei Gliederungselementen befindet man sich häufig in einem Zweispalt. Wir wollen dies an folgenden Alternativen für die Benennung des ersten Kapitels eines Buches demonstrieren. Die erste Variante sieht so aus:

Beispiel
<buch>
  <einfuehrung>
    ...
  </einfuehrung>
  ...
</buch>

Und hier folgt die zweite Fassung:

<buch>
  <kapitel>
    ...
  </kapitel>
  ...
</buch>

Selbstverständlich enthält die erste Version mehr Informationen. Hier ist ganz klar, dass das erste Element im Buch die Einführung ist. Im zweiten Beispiel kann man nicht mehr darüber aussagen, als dass es sich um das erste Kapitel handelt, aber nicht welche Funktion es erfüllt.

Welche Lösung Sie in einem solchen Fall wählen sollten, hängt von Ihrer konkreten Anwendung ab. Können Sie auf die zusätzliche Information verzichten? Falls Sie aus all Ihren Texten die einführenden Worte extrahieren möchten, bekommen Sie im zweiten Beispiel Probleme. Denn dann muss ein menschlicher Leser nachsehen, ob das erste Kapitel wirklich eine Einleitung ist oder ob der Autor eine Einführung weglässt und sofort in medias res geht.

Auf der anderen Seite ist es natürlich leichter, in der DTD nicht auf alle Besonderheiten Rücksicht zu nehmen. In diesem Beispiel kann man noch einen Kompromiss eingehen. Dazu versehen wir den Elementtyp kapitel mit einem Attribut namens inhalt. Als mögliche Werte erlauben wir in der DTD einfuehrung und normal. Das obige Beispiel schreiben wir nun folgendermaßen:

<!-- In der DTD: -->
 
<!ELEMENT kapitel ...>
<!ATTLIST kapitel inhalt (normal|einfuehrung) "normal">
 
 
<!-- In der Instanz: -->
 
<buch>
  <kapitel inhalt="einfuehrung">
    ...
  </kapitel>
  <kapitel>
    ...
  </kapitel>
  ...
</buch>

Auf diese Weise haben wir sowohl die Gliederungsinformation als auch die Information über den Inhalt. Der Aufzählungstyp des Attributs verhindert, dass ein Autor unvorhergesehene Begriffe eingibt (nur einfuehrung und normal sind erlaubt). Er lässt sich aber bei Bedarf leicht erweitern.

Wir sind damit schon bei der nächsten philosophischen Frage angelangt: Soll ich Elemente oder Attribute verwenden?

Elemente versus Attribute
Elemente:versus AttributeAttribute:versus Elemente Meistens lassen sich — mit mehr oder weniger großem Aufwand — Elemente und Attribute ineinander umwandeln. Wir zeigen dies an einigen Beispielen. Zuerst zwei Möglichkeiten, die Überschrift eines Kapitels in einem Dokument unterzubringen:

Beispiel
<kapitel ueberschrift="Entwicklung einer DTD">
  ...
</kapitel>
 
 
<kapitel>
  <ueberschrift>Entwicklung einer DTD</ueberschrift>
  ...
</kapitel>

Die gewünschte Information ist in beiden Fällen vorhanden, wo liegen also die Unterschiede? — Attribute erlauben die Definition einer eingeschränkten Menge von erlaubten Werten. Dies ist hier sicherlich nicht sinnvoll. Andererseits können Sie für Elemente das Inhaltsmodell angeben; es können also eingebettete Elemente existieren. Dies geht bei Attributen nicht. Möchten Sie in Überschriften Auszeichnungen zulassen, so müssen Sie sich für das Element und gegen das Attribut entscheiden. In der folgenden Anwendung ist beispielsweise die DTD als acro ausgezeichnet, um den Inhalt als Akronym zu identifizeren.

<kapitel>
  <ueberschrift>Entwicklung einer <acro>DTD</acro></ueberschrift>
  ...
</kapitel>

Als weiteren Grund für die Verwendung der Element-Variante in diesem Fall möchten wir anführen, dass die Überschrift ein Teil des Inhalts des Dokuments ist und als solcher in einem Element stehen sollte. Den anderen Fall zeigen wir mit einem weiteren Beispiel.

Beispiel

Hier geht es darum, eine Liste Ihrer Musiksammlung zu verwalten. Neben den Informationen wie Musiker, Band, Titel, Erscheinungsjahr und so weiter möchten Sie auch noch abgespeichern, auf welchem Aufnahmemedium, also Vinyl, CD oder MC, Sie die Aufnahme vorliegen haben. Wir zeigen auch hier wieder zwei Varianten, zunächst ausschließlich mit Elementen, dann mit einem Attribut.

<album>
 <medium>Vinyl</medium>
 <musiker>Jackson Browne</musiker>
 <titel>For Everyman</titel>
 <jahr>1973</jahr>
 <label>Asylum Records</label>
 ...
</album>
<album>
 <medium>CD</medium>
 <musiker>Jackson Browne</musiker>
 <titel>Running on Empty</titel>
 <jahr>1977</jahr>
 <label>Elektra/Asylum Records</label>
 ...
</album>

Es folgt die Attribut-Alternative:

<album medium="Vinyl">
 <musiker>Jackson Browne</musiker>
 <titel>For Everyman</titel>
 <jahr>1973</jahr>
 <label>Asylum Records</label>
 ...
</album>
<album medium="CD">
 <musiker>Jackson Browne</musiker>
 <titel>Running on Empty</titel>
 <jahr>1977</jahr>
 <label>Elektra/Asylum Records</label>
 ...
</album>

Hier ist die Information Vinyl beziehungsweise CD kein eigentlicher Bestandteil des Dokumentinhalts. Es handelt sich vielmehr um eine Information über den Inhalt; es ist eine Klassifizierung. In gleicher Weise könnten Sie auch festhalten, ob es sich bei der Aufnahme um eine reguläre Veröffentlichung oder um einen halboffiziellen KonzertmitschnittFussnote»Halboffiziell« klingt angenehmer als »illegal«. handelt. Auch dies ist eine Metainformation. Die Attributvariante erscheint deshalb in diesen beiden Fällen angebracht. Ein weiteres Argument dafür ist, dass hier nur eine begrenzte Anzahl von Möglichkeiten existiert. Das Attribut sollten Sie daher folgendermaßen in der DTD definieren:

<!--      Element     Attributname   Werte            Vorgabe -->
<!ATTLIST album       medium         (Vinyl| CD| MC)  "Vinyl"     >

Eine Einschränkung auf diese drei Werte ist bei einem Element nicht möglich.

Bisher haben wir einen Weg verschwiegen. Wir haben die Elemente, zuletzt medium, den anderen Elementen stets gleichgesetzt. XML erlaubt bekanntlich aber auch die Verschachtelung. Sie könnten Ihre Musiksammlung also auch so speichern:

<album>
 <vinyl>
    <musiker>Jackson Browne</musiker>
    <titel>For Everyman</titel>
    <jahr>1973</jahr>
    <label>Asylum Records</label>
    ...
 </vinyl>
</album>
<album>
 <cd>
    <musiker>Jackson Browne</musiker>
    <titel>Running on Empty</titel>
    <jahr>1977</jahr>
    <label>Elektra/Asylum Records</label>
    ...
 </cd>
</album>

Hier ist die fragliche Information nun nicht mehr im Inhalt des Elements medium enthalten, sondern befindet sich im Namen der neuen Elemente vinyl, cd und mc. Dieser Ansatz bietet ähnliche Vorteile wie das Attribut: Zusammen mit folgender Definition des übergeordneten Elements album stehen auch hier nur die drei Wahlmöglichkeiten zur Verfügung.

<!ELEMENT album  (vinyl | cd | mc) >

Wir favorisieren hier dennoch die Attribut-Variante, allerdings aus einem eher pragmatischen Grund heraus. Das Inhaltsmodell von vinyl, cd und mc ist identisch. Selbst wenn noch weitere Alternativen hinzukommen, etwa DVD oder Tonband, wird sich daran nichts ändern. Es besteht daher keine Notwendigkeit, drei Elementtypen zu verwenden, da sie alle gleich aufgebaut sind. Anders ist das, wenn die Elementtypen unterschiedliche Inhaltsmodelle besitzen. Dies wollen wir noch kurz erläutern, ohne jedoch ein Beispieldokument zu zeigen.

Eine Liste von Büchern, wie in der Bibliografie zu diesem Buch, ist sehr ähnlich zu obiger Musiksammlung. An die Stelle des Musikers tritt der Autor, das Label entspricht dem Verlag und so weiter. Das Aufnahmemedium entspricht ungefähr der Publikationsform, also Buch, Artikel, technischer Report, Doktorarbeit, Handbuch usw. Auch diese Information kann nun in der zuvor diskutierten Weise gespeichert werden. Im Gegensatz zu den Musikdaten empfiehlt sich hier jedoch nicht die Attributlösung, sondern die Verwendung des zuletzt gezeigten Ansatzes, der hier etwa so aussieht:

<!ELEMENT publikation    ( buch | artikel | techreport | 
                           dokarbeit | handbuch ) >

Wir entscheiden uns für Elemente statt Attribute, weil jede dieser Alternativen jeweils ein anderes Inhaltsmodell besitzt. Zum Beispiel gehört zur bibliografischen Information eines Artikels die Angabe, in welcher Zeitschrift er erschienen ist. Bei einem Buch kommt diese Information nicht vor.

Wenn man nun eine Bibliografie aus einer Folge von Publikationen der obigen Form zusammensetzt, sieht das in der DTD wie folgt aus:

<!ELEMENT bibliografie (publikation+)>

Es ist naheliegend, den Elementtyp publikation einzusparen und ein Parameter-Entity daraus zu machen.

<!ENTITY % publikation    "buch | artikel | techreport | 
                           dokarbeit | handbuch " >
 
<!ELEMENT bibliografie  (%publikation;)+>

Um die Diskussion zu beenden, fassen wir unsere Ausführungen in folgenden Tipps zusammen:

Tipp

Gruppierung von Elementtypen mit Parameter-Entities
Im Abschnitt 13.2.1 haben wir schon darauf hingewiesen, dass es dem besseren Verständnis des Dokumenttyps dienen kann, wenn Sie auf (implizit) vorhandene Hierarchien Ihrer Elemente achten. Die bei dieser Analyse entstehenden Elementgruppen lassen sich natürlich auch in der XML-DTD darstellen. Der Schlüssel dazu sind die Parameter-Entities. Aus technischer Sicht haben wir sie in Abschnitt 5.8.3 schon behandelt. An dieser Stelle möchten wir noch einmal den Zusammenhang mit den Hierarchien aufzeigen. Dazu ziehen wir noch einmal die Hierarchieebenen der Block- und der Zeichenelemente heran. Wir gruppieren sie mit folgenden Parameter-Entities:

Beispiel
<!-- Parameter-Entities                                   -->
<!ENTITY % block   "absatz | listing | abbildung | tabelle"  >
<!ENTITY % zeichen "acro | person | befehl | ort | strasse" >
 
 
<!-- Hierarchie-Ebene Gliederung                                   -->
<!ELEMENT buch            (kapitel+)>
<!ELEMENT kapitel         (ueberschrift, (%block;)*, abschnitt+)>
<!ELEMENT abschnitt       (ueberschrift, (%block;)*, unterabschnitt*)>
<!ELEMENT unterabschnitt  (ueberschrift, (%block;)+)>
 
 
<!-- Hierarchie-Ebene Block                  -->
<!ELEMENT absatz        (#PCDATA | %zeichen;)* >
<!ELEMENT ueberschrift  (#PCDATA | %zeichen;)* >
<!ELEMENT tabelle       (#PCDATA | %zeichen;)* >

Wir haben hier auf eine Gruppierung der Gliederungsebene (Kapitel usw.) mit Parameter-Entities verzichtet, weil diese Elemente meist nur selten im Inhaltsmodell eines anderen Elementtyps vorkommen. Hingegen haben wir hier je dreimal die Abkürzungen %block; und %zeichen; eingesetzt. Neben der kürzeren Schreibweise und der verbesserten Lesbarkeit der DTD haben wir dadurch einen weiteren Vorteil erzielt: Änderungen der DTD sind leichter durchzuführen. Bei Einführung eines neuen Blocks beispielsweise, genügt die Änderung der Definition des Parameter-Entity %block;.

Weitere Erklärungen sollten überflüssig sein, da dies letzlich nur eine Umsetzung von zuvor behandelten Ideen ist. Eines scheint aber doch noch erwähnenswert: Die Abbildung von Hierarchie-Ebenen auf Parameter-Entities ist nicht eindeutigFussnoteFür Mathematiker: Die Abbildung ist nicht bijektiv :-): Die ueberschrift ist zwar sehr wohl ein Blockelement, erscheint aber dennoch nicht im entsprechenden Parameter-Entity. Der Grund ist einfach: Wir wollten Überschriften nur am Anfang eines Kapitels, Abschnitts usw. zulassen. Der Stern-Operator hinter %block; hätte jedoch mehrere Überschriften erlaubt. Die Definition von Parameter-Entities sollte also immer noch unter pragmatischen Gesichtspunkten erfolgen.

Mehrfachverwendung von DTD-Fragmenten versus Spezialelemente
DTD:Fragmente Bereits im Abschnitt 5.8.3 haben wir erwähnt, dass man Elementtypen, die man in verschiedenen DTDs benutzt, als Fragmente speichern kann und damit einzelne Bausteine für eine neue DTD zur Verfügung stehen. Diese Vorgehensweise ist auf der einen Seite sehr praktisch, auf der anderen Seite können solche allgemeinen Elementtypen niemals perfekt an die konkrete Anwendung angepasst sein. Im Folgenden diskutieren wir diese Problematik am Beispiel des Elementtyps Tabelle und zeigen einen Weg, der für einen geringen Preis alle Vorteile besitzt.

Beispiel

Im folgenden Beispiel geht es darum, den aktuellen Tabellenstand der Fußball-Bundesliga aufzuschreiben. Auf den ersten Blick bietet es sich an, dafür die DTD für eine Tabelle zu verwenden. Wir gehen nun davon aus, dass ein Tabellenmodell bereits verfügbar ist und dass es auch schon Formatierer bzw. Konvertierer dafür gibt. Dann kann man gleich eine Instanz schreibenFussnoteBei diesem Beispiel gehen wir davon aus, dass es sich bei der Tabelle in der Datei /usr/local/sgml/tabelle.dtd um ein Modell handelt, das dem HTML-Tabellenmodell entspricht.
Für den Inhalt zeichnen wir übrigens nicht verantwortlich. Es ist ein Ausschnitt aus dem Tabellenstand der Saison 1997/98 nach dem zwanzigsten Spieltag.
:

<?xml version="1.0"?>
<!DOCTYPE table SYSTEM "/usr/local/sgml/tabelle.dtd">
<table border="1">
 <tr><th>Mannschaft    </th><th>Punkte</th><th>Tor-Verhältnis</th></tr>
 
 <tr><td>Kaiserslautern</td><td>45</td><td>+17</td></tr>
 <tr><td>B. München</td><td>41</td><td>+18</td></tr>

 ...

 <tr><td>VfL Bochum    </td><td>20</td><td> -9</td></tr>
 <tr><td>1. FC Köln    </td><td>20</td><td>-13</td></tr>
</table>

Diese Instanz kann nun direkt formatiert oder anderweitig verarbeitet werden. In Abbildung 54 ist die Darstellung im Browser zu sehen. Zu verdanken ist dieser Vorteil der Mehrfachverwendung des existierenden Tabellenmodells.

Browser-Darstellung des Ausschnitts aus der Bundesliga-Tabelle

Abbildung 54: Browser-Darstellung des Ausschnitts aus der Bundesliga-Tabelle

Der Preis dafür ist, dass die benutzten Elementnamen keine Aussage über den Inhalt machen. Ein XML-System sieht nur, dass es sich um eine Tabelle handelt. Von der Fußball-Bundesliga hat es keine Ahnung. Zugegeben, dem System etwas über Fußball beizubringen, dürfte schwierig sein, aber es wäre doch schöner, sprechende Elementnamen zu verwenden, die etwas über den darin befindlichen Inhalt aussagen. Ein Modell dafür lässt sich leicht entwerfen. Wir zeigen es gleich mit einer gültigen Instanz:

Beispiel
<?xml version="1.0"?>
<!DOCTYPE liga [
  <!ELEMENT liga    (pos+)                 >
  <!ELEMENT pos     (verein, punkte, tore) >
  <!ELEMENT verein  (#PCDATA)              >
  <!ELEMENT punkte  (#PCDATA)              >
  <!ELEMENT tore    (#PCDATA)              >
]>
<liga>
  <pos>
    <verein>Kaiserslautern</verein>
    <punkte>45</punkte>
    <tore>+17</tore>
  </pos>
  <pos>
    <verein>B. München</verein>
    <punkte>41</punkte>
    <tore>+18</tore>
  </pos>

  ...

  <pos>
    <verein>VfL Bochum</verein>
    <punkte>20</punkte>
    <tore>-9</tore>
  </pos>
  <pos>
    <verein>1. FC Köln</verein>
    <punkte>20</punkte>
    <tore>-13</tore>
  </pos>
</liga>

Nun hat man zwar den Vorteil, dass die Elemente eine gewisse Meta-Information transportierenFussnoteNebenbei hat man noch etwas mehr gewonnen: Eine Position in der Liga-Tabelle besteht aus den Elementen verein, punkte, tore. Ein guter XML-Editor wird also für jedes Element pos automatisch die anderen drei Elemente einfügen. Bei einer allgemeinen Tabelle kann er das nicht, weil nicht klar ist, wie viele Felder eine Tabellenzeile besitzt., jedoch funktionieren die schon vorhandenen Formatierer nicht mehr, denn sie kennen ja nur das allgemeine Tabellenmodell. Wir beheben dieses Problem durch ein kurzes Jade-Programm, welches das neue liga-Modell in die alte table transformiert.

Beispiel
<!DOCTYPE style-sheet 
          PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN">
(declare-flow-object-class element
  "UNREGISTERED::James Clark//Flow Object Class::element")


(element liga
  (make element gi: "table"
	(make element gi: "tr"           ; Kopfzeile der Tabelle
	      (make sequence
		(make element gi: "th"
		      (literal "Mannschaft"))
		(make element gi: "th"
		      (literal "Punkte"))
		(make element gi: "th"
		      (literal "Tor-Verhältnis"))))
	(process-children)))             ; Inhalt der Tabelle

(element pos
  (make element gi: "tr"))

(element verein
  (make element gi: "td"))

(element punkte
  (make element gi: "td"))

(element tore
  (make element gi: "td"))

Die Vorgehensweise lässt sich folgendermaßen zusammenfassen:

Tipp

Valid HTML 4.01!Valid CSS!