<!ELEMENT myDocument (title, body)> <!ELEMENT title (#PCDATA)> <!ELEMENT body (#PCDATA)>Die erste Zeile definiert das Element 'myDocument' mit den Unterelementen 'title' und 'body'. Beide Elemente werden erst nachfolgend genauer beschrieben.
<!ENTITY % myDocument.global "myDocument"> <!ENTITY % myDocument.Content "title, body"> <!ELEMENT %myDocument.global; (%myDocument.Content;)>Zunächst werden zwei Parameter-Entities deklariert, diese werden anschließend sofort verwendet. Mit solchen Techniken, die erst bei größeren Projekten sinnvoll sind, können bsp. Wiederholungen im Content eines Elements oder Standardattribute (= Attribute, die für viele Elementtypen gelten sollen), erzeugt werden. Da Elementnamen und Entity-Namen zu verschiedenen Namensräumen gehören, hätte man die erste Entity auch wie folgt definieren können:
<!ENTITY % myDocument "myDocument">Aufgrund der Verwendung in der externen DTD, in einer Elementdefinition oder als Element im eigentlichen Xml-Dokument ist die Eindeutigkeit garantiert. Bei einer größeren DTD werden zu Beginn zunächst einmal sehr viele dieser Parameter-Entities definiert, erst anschließend folgen die Elementdeklarationen. Die Darstellung dieses Textes in der umgekehrten Reihenfolge erfolgt aus Verständnisgründen.
<!ELEMENT QNAME CONTENT-SPECIFICATION>QNAME (= qualified Name) ist ein selbst festgelegter Name für das Element. Es kann sich um einen 'einfachen Namen' oder um einen Namen, bestehend aus dem namespace prefix und dem local part, verbunden durch den Doppelpunkt als Trenner. Die Xml-Spezifikation von 1998 berücksichtigt das Namespace-Konzept noch nicht. Der Doppelpunkt sollte jedoch ausschließlich zur Trennung von Prefix und lokalem Namen verwendet werden, da alle Parser den Doppelpunkt in diesem Sinne interpretieren.
Der Content eines Elements kann entweder durch die Schlüsselwörter EMPTY / ANY, also leer bzw. beliebig, oder durch eine Contentangabe in Klammern, also Unterelemente und / oder Text, festgelegt werden.
, strikte Reihenfolge | genau eines der beiden Elemente (ausschließend)
? kein- oder einmal + ein- oder mehrmals * kein-, einmal oder mehrmalsWird nichts notiert, so bedeutet dies 'genau einmal'. Jeder dieser Blöcke kann geklammert, der Klammerausdruck mit Quantifikatoren versehen und mit weiteren Blöcken kombiniert werden.
<!ELEMENT body (#PCDATA)> <!ELEMENT body (#PCDATA | b | i)*>Bei der ersten Darstellung kann auf die schließende Klammer auch '*' folgen, die zweite Darstellung kann weitere Elemente enthalten. Die zweite Darstellung darf jedoch keine geklammerte Liste enthalten. Sämtliche der folgenden Darstellungen sind syntaktisch fehlerhaft:
<!ELEMENT body (#PCDATA?)> <!ELEMENT body (#PCDATA)+> <!ELEMENT body (#PCDATA, b)> <!ELEMENT body (#PCDATA | b*)> <!ELEMENT body (#PCDATA | b*)*> <!ELEMENT body (#PCDATA | b+)> <!ELEMENT body (#PCDATA | b)+> <!ELEMENT body (#PCDATA | b | b)*> <!ELEMENT body (#PCDATA | b | (c | d))>Man kann also nicht fordern, daß Text höchstens / mindestens ein Zeichen enthält, daß auf Text ein abschließendes Element folgt, das eventuell sogar weggelassen werden kann (b*) oder daß mindestens Text oder ein Element folgt. Auch der Ausdruck '(#PCDATA | b*)*', der eigentlich mehr erlaubt als der Ausdruck '(#PCDATA | b)*', ist wegen des inneren '*' nicht erlaubt. Ferner ist bei gemischtem Content eine Verdoppelung 'b | b' nicht zulässig, auch dürfen keine zusätzlichen Klammern gesetzt werden.
<!ELEMENT my-hr EMPTY>Dies ist die Html-Definition des html:hr-Elements - dieses enthält keine Unterelemente. Statt EMPTY könnte für ein eigenes Element auch ANY stehen - dann wären sowohl Unterelemente als auch Text zulässig. Beachten Sie, daß EMPTY hier tatsächlich strikt EMPTY heißt - weder Leerzeichen noch ein Zeilenumbruch. Um bei einer solchen Definition Fehler zu vermeiden, empfiehlt sich die Verwendung der speziellen Form für leere Elemente:
<my-hr/>
<!ELEMENT notice (#PCDATA)>Das Element 'notice' darf nur Text und Entities enthalten, deren Ersetzungstext elementfrei ist. Unterelemente sind ausgeschlossen.
<!ELEMENT notice-formatted (#PCDATA | b | u | i)*>Hier sind zusätzlich zum Text auch die Unterelemente b, u und i erlaubt. Dies bedeutet nicht, daß eines dieser Elemente Unterelement von einem der anderen Elemente sein darf oder daß eines dieser Elemente Text enthält. All diese Dinge müssen bei der Definition von b, u und i festgelegt werden.
<!ELEMENT html (head, body)>Dies ist die Definition des Html-Elements html. In diesem sind genau zwei Unterelemente - head und body - erlaubt, die Reihenfolge ist strikt vorgegeben. Implizit ist damit ausgedrückt, daß jedes Element genau einmal auftreten darf, es darf weder fehlen noch darf es mehrfach auftreten.
<!ELEMENT head (title, meta*)>Damit wird festgelegt, daß im head-Element genau ein title-Element, gefolgt von 0, einem oder mehreren meta-Elementen gefordert wird.
<!ELEMENT head ((title, meta*) | (meta*, title))>Eine solche Definition heißt: {Entweder title und 0 oder mehrere meta} oder {0 oder mehrere meta und ein title-Element}. Anders ausgedrückt: title muß genau einmal im head vorkommen, ein Block von meta-Elementen kann vor oder nach dem title-Element eingefügt werden, der meta-Block muß jedoch zusammenhängend sein.
<!ELEMENT head (meta*, title, meta*)>Hier ist ebenfalls ein title-Element zwingend, die meta können jedoch sowohl vor als auch nach title folgen, sie müssen nicht aufeinander folgen.
<!ELEMENT tr (th+ | td+)>Das Element tr hat entweder mehrere Unterelemente th oder mehrere Unterelemente td, es ist jedoch weder Text noch ein leeres tr erlaubt. Ferner dürfen nicht beide Unterelemente gleichzeitig auftreten. Dies entspricht der Situation in Html, in der bei einer Zeile tr entweder Tabellenheader th oder Tabellenzellen td sinnvoll sind. Ersetzt man eines der '+' durch ein '*', so erfüllt auch ein leeres tr-Element diese Definition.
<!ELEMENT tr (td, td, td)> <!ELEMENT tr (td, td, td?, td?, td)> <!ELEMENT tr (td, td+, td)>Mit solchen, offenbar zwar möglichen, aber nicht mehr sehr intuitiven Konstruktionen lassen sich gewisse Unterstrukturen festlegen. Die erste Definition verlangt strikt drei Elemente, die zweite Definition fordert drei und ermöglicht zweimal 0 oder 1, maximal also fünf Elemente. Die dritte Definition wünscht zwei Elemente fixiert sowie eine Folge von td, bestehend aus mindestens einem Element. Also entspricht dies der Bedingung 'mindestens drei td-Unterelemente'.