Den Anfang macht die wichtigste Komponente der
DTD, die
Elementtyp-DeklarationEin
Elementtyp verhält sich zu einem Element so,
wie sich in der objektorientierten Programmierung Klassen zu
Instanzen verhalten.. Sie
besitzt folgende Gestalt:
Der Name ist die Bezeichnung eines Elements. Dafür gelten einige Regeln, die wir gleich nennen werden. Wichtig ist natürlich der Inhalt (contentspec). Vor einer Erklärung sollen die folgenden Beispiele einen Eindruck von Elementtyp-Deklarationen geben.
<!ELEMENT adresse1 (vorname, nachname, strasse, ort)> <!ELEMENT adresse2 (anrede?, vorname, nachname, strasse, ort)> <!ELEMENT adresse3 ((firma | person) , strasse, ort)> <!ELEMENT firma (firmenname)> <!ELEMENT person (anrede?, vorname, nachname)> <!ELEMENT adressbuch (adresse)+> <!ELEMENT adressbuch (adresse)*>
Die Namen von Elementen beginnen mit einem Buchstaben, dem Unterstrich oder einem Doppelpunkt. Als weitere Zeichen sind dann auch Ziffern, der Punkt und der Bindestrich gestattet (die genaue Syntax enthalten die Klauseln [4] bis [8] der Spezifikation). Zwei Dinge sind wichtig:
Namensräumebenutzt (siehe Kapitel 6).
Das Repertoire zur Definition des Inhaltes zeigen im Wesentlichen die obigen Beispiele. Der Reihe nach: Eine adresse1 besteht einfach aus der Folge vorname, nachname, strasse, ort. Das Komma zwischen den Elementen ist der so genannte Sequenz-Operator.
<!ELEMENT adresse1 (vorname, nachname, strasse, ort)>
Die Variante adresse2 stellt eine optionale Anrede voran. Das Fragezeichen ist hier das wichtige Zeichen. Es bedeutet, dass die anrede fehlen darf.
<!ELEMENT adresse2 (anrede?, vorname, nachname, strasse, ort)>
Das letzte Adresstyp-Beispiel, adresse3, kann sogar mit Firmen- und Privatadressen umgehen. Diese Flexibilität verdankt es dem Oder-Operator, der als senkrechter Strich geschrieben wird. In diesem Fall kann man zwischen einer Firma und einer Person wählen.
<!ELEMENT adresse3 ((firma | person) , strasse, ort)>
Die letzten zwei Beispiele sind alternative Formen eines Adressbuchs. Bei der Variante mit dem Pluszeichen muss ein Adressbuch mindestens eine Adresse enthalten.
<!ELEMENT adressbuch (adresse)+>
Der Stern in der zweiten Adressbuch-Version bedeutet,
dass beliebig viele Adressen aufeinander folgen
dürfen. Im Unterschied zum Pluszeichen darf das Buch hier auch
leer sein. Beliebig viele
heißt also 0 oder 1 oder 2
oder ...
<!ELEMENT adressbuch (adresse)*>
Die vorgestellten Symbole Komma, senkrechter Strich, Fragezeichen, Plus und Stern entsprechen übrigens den hier benutzten Syntaxdiagrammen.
Für komplexere Elementinhalte können die Operatoren kombiniert werden. So kombiniert etwa das Beispiel adresse3 den Sequenz- und den Oder-Operator. Um Verwechslungen zu vermeiden, müssen Klammern gesetzt werden. Die exakten Regeln sind etwas komplizierter. Sie sind im Anhang A aufgelistet. Für die Praxis empfehlen wir insbesondere den Einsteigern:
Inhalte, die nicht nur aus Elementen
bestehen
Nach den bisherigen Ausführungen
ist noch unklar, an welchen Stellen Text eingegeben werden
darf. Selbstverständlich sollte im Element strasse auch wirklich ein Straßenname
stehen. Die folgende Deklaration lässt dies zu, indem sie als
Inhalt von strasse
PCDATA (Parsed
Character Data) einsetztDer Unterschied
zwischen PCDATA und CDATA besteht
darin, dass ersteres vom Parser analysiert wird, während
letzteres nicht mehr betrachtet wird. Die Konsequenz davon
ist, dass innerhalb von CDATA keine Markup-Zeichen
(z.B. spitze Klammern) erkannt werden. In PCDATA
werden aber auch Entity References erkannt und aufgelöst..
<!ELEMENT strasse (#PCDATA)>
In gleicher Weise können die anderen
Elementtyp-Deklarationen geschrieben werden. Was
in dem Adressen-Beispiel nicht sehr sinnvoll ist, ist
so genannter gemischter Inhalt (mixed
content). Darunter versteht man Inhalt, der sowohl
Text (PCDATA) als auch andere Elemente
enthältStreng genommen ist das nicht richtig. Die
Spezifikation bezeichnet auch ein einzelnes
PCDATA als
mixed content
(Klausel
[51]). Zur Erläuterung schien es uns jedoch sinnvoller,
zwischen nur Text
und Text und Elemente
vermischt
zu differenzieren. Abgesehen von dieser Stelle
werden wir im restlichen Buch auf Korrektheit
achten.. In der Deklaration muss dann
PCDATA vor
den weiteren Elementen stehen. Folgendes Syntaxdiagramm
zeigt den Aufbau:
Eine Anwendung ist zum Beispiel der Inhalt eines
Absatzes
. Er enthält Text, aber auch weitere
Elemente. Wir zeigen dies mit dem aus HTML
bekannten Element em
(emphasize) zur Hervorhebung. Zuerst die Deklaration, dann
die Anwendung:
<!-- Deklaration --> <!ELEMENT absatz (#PCDATA | em)* > <!ELEMENT em (#PCDATA) > <!-- Anwendung --> <absatz>Ein Beispiel für eine <em>Hervorhebung</em> in einem Absatz</absatz>
Zwei reservierte Namen für den Inhalt eines Elements sind ANY und EMPTY. ANY erlaubt gemischte Inhalte mit jedem beliebigen Element, das in der DTD deklariert ist. EMPTY deklariert ein leeres Element, wie etwa das img aus HTML.
<!ELEMENT alles-in-einem ANY > <!ELEMENT hr EMPTY >