Exkurs - Dokumenttypdefinitionen
Beispiel für eine Dokumenttypdefinition
Wir betrachten noch einmal die DTD zur Beschreibung von Oberstufenkursen:
<!ELEMENT Kurs (Fach, Typ, Stufe, Bezeichner, Unterricht, Lehrer, Schüler*)>
<!ELEMENT Fach (#PCDATA)>
<!ELEMENT Typ (#PCDATA)>
<!ELEMENT Stufe (#PCDATA)>
<!ELEMENT Bezeichner (#PCDATA)>
<!ELEMENT Unterricht (Einheit+)>
<!ELEMENT Einheit (Tag, Stunde, Raum?)>
<!ELEMENT Tag (#PCDATA)>
<!ELEMENT Stunde (#PCDATA)>
<!ELEMENT Raum (#PCDATA)>
<!ELEMENT Lehrer (Name, Vorname)>
<!ATTLIST Lehrer
kürzel CDATA #REQUIRED
geschlecht CDATA #REQUIRED
>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Vorname (#PCDATA)>
<!ELEMENT Schüler (Name, Vorname, Kurssprecher?)>
<!ATTLIST Schüler
geschlecht CDATA #REQUIRED
>
<!ELEMENT Kurssprecher EMPTY>
Die einzelnen Zeilen der oben gezeigten DTD sollen im Folgenden kurz erläutert werden.
Deklaration der XML-Elemente
Für jedes XML-Element gibt es eine genaue Strukturbeschreibung.
<!ELEMENT Kurs (Fach, Typ, Stufe, Bezeichner, Unterricht, Lehrer, Schüler*)>
Hier wird das Wurzelelement und sein Inhalt festgelegt. Das Wurzelelement hat den Namen
Kurs
. Sein Inhalt besteht aus einer Sequenz von Elementen:
Zuerst ein Fach
-Element, gefolgt von einem Typ
-Element, gefolgt
von einem Stufe
-Element usw..
Beachte den Stern hinter dem Schüler
-Element. Dieser Stern als Zusatzsymbol deutet hier an,
dass ein Schüler
-Element wiederholt auftreten kann.
<!ELEMENT Fach (#PCDATA)>
<!ELEMENT Typ (#PCDATA)>
<!ELEMENT Stufe (#PCDATA)>
<!ELEMENT Bezeichner (#PCDATA)>
Diese Zeilen legen fest, dass die betreffenden Elemente als Inhalt nur Zeichen (sogenannte
parsed character data
) haben.
<!ELEMENT Unterricht (Einheit+)>
<!ELEMENT Einheit (Tag, Stunde, Raum?)>
Diese Zeilen legen die Struktur des Unterricht
-Elements und des Einheit
-Elements fest.
Beachte auch hier die Zusatzsymbole "+" und "?". Ein Unterricht
-Element besteht aus einer
Wiederholung von Einheit
-Elementen. Es muss dabei mindestens ein Einheit
-Element
vorkommen. Ein Einheit
-Element ist eine Sequenz bestehend aus einem Tag
-Element,
gefolgt von einem Stunde
-Element und einem optionalen Raum
-Element
(dieses Element kann hier stehen, muss aber nicht).
<!ELEMENT Tag (#PCDATA)>
<!ELEMENT Stunde (#PCDATA)>
<!ELEMENT Raum (#PCDATA)>
Diese Zeilen legen fest, dass die betreffenden Elemente als Inhalt nur Zeichen (sogenannte
parsed character data
) haben.
<!ELEMENT Lehrer (Name, Vorname)>
<!ATTLIST Lehrer
kürzel CDATA #REQUIRED
geschlecht CDATA #REQUIRED
>
Diese Zeilen legen die Struktur des Lehrer
-Elements fest. Sein
Inhalt ist eine Sequenz bestehend aus einem Name
-Element und einem Vorname
-Element.
Zusätzlich werden hier die Attribute des Lehrer
-Elements festgelegt (s.u.).
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Vorname (#PCDATA)>
Diese Zeilen legen fest, dass die betreffenden Elemente als Inhalt nur Zeichen (sogenannte
parsed character data
) haben.
<!ELEMENT Schüler (Name, Vorname, Kurssprecher?)>
<!ATTLIST Schüler
geschlecht CDATA #REQUIRED
>
<!ELEMENT Kurssprecher EMPTY>
Das Schüler
-Element ist analog zum Lehrer
-Element aufgebaut.
Eine Sonderstellung nimmt das optionale Kurssprecher
-Element ein.
Das Kurssprecher
-Element ist ein leeres Elemente, das keinen Inhalt hat.
Zusatzsymbole und ihre Bedeutung
Bei der Festlegung von Elementen werden Zusatzsymbole benutzt. Die folgende Übersicht zeigt diese Symbole und ihre Bedeutung:
Operator | Bedeutung |
---|---|
() | Klammern zur Bildung von Elementgruppen |
, | Trennzeichen innerhalb einer Sequenz von Elementen |
| | Trennzeichen zwischen sich ausschließenden Alternativen |
* | Element(gruppe) kann beliebig oft (auch gar nicht) vorkommen |
+ | Element(gruppe) muss mindestens einmal vorkommen, kann mehrfach vorkommen |
? | Element(gruppe) kann einmal oder kein mal vorkommen |
Deklaration von Attributen
In der oben gezeigten DTD bleiben nur noch die Attributdeklarationen zu erläutern:
<!ATTLIST Lehrer
kürzel CDATA #REQUIRED
geschlecht CDATA #REQUIRED
>
Hier wird festgelegt, dass eine Lehrer
-Element ein Attribut kürzel
hat, das nicht weggelassen werden kann und dessen Wert eine Zeichenkette ist, sowie ein Attribut geschlecht
,
das ebenfalls nicht weggelassen werden kann und dessen Wert ebenfalls eine Zeichenkette ist.
Eine solche Attributfestlegung bezieht sich immer auf ein XML-Element. Sie listet alle Attribute des Elements auf und
legt die erlaubten Attributwerte fest (z. B. CDATA
für Zeichenketten).
Zudem legt sie u.a. fest, ob das Attribut in jedem Element
vorkommen muss (REQUIRED
) oder ob es auch weggelassen werden kann (IMPLIED
).
Weitere Details findet man in geeigneten Nachschlagewerken.
Einbindung einer DTD
In den bisher betrachteten Beispielen ist die DTD jeweils in einer eigenen Datei abgespeichert worden. Das ist von Vorteil, wenn die DTD in verschiedene XML-Dokumente eingebunden werden soll. Die Einbindung erfolgt dann nach folgendem Muster:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE Kurs SYSTEM "kurs.dtd">
<Kurs>
...
</Kurs>
Sie muss direkt nach dem XML-Prolog stehen.
Beachte, dass der Name hinter DOCTYPE
mit dem Namen
des Wurzelelements des XML-Dokuments übereinstimmen muss.
Mit dem Schlüsselwort SYSTEM
wird hier festgelegt, dass die DTD nur auf dem lokalen System
verwendet wird.
Eine DTD kann auch direkt in ein XML-Dokument eingebunden werden. Der folgende Ausschnitt zeigt, wie dies erfolgen kann.
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE Kurs [
<!ELEMENT Kurs (Fach, Typ, Stufe, Bezeichner, Unterricht, Lehrer, Schüler*)>
...
]>
<Kurs>
...
</Kurs>
Soll eine DTD öffentlich zugänglich gemacht werden, so verwendet man statt des Schlüsselworts
SYSTEM
das Schlüsselwort PUBLIC
. Als Beispiel haben wir bereits die folgende
Einbindung der DTD für XHTML kennen gelernt:
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html ...>
...
</html>
Die weiteren Angaben hinter dem Schlüsselwort PUBLIC
dienen dazu, die DTD eindeutig
identifizierbar zu machen.