# Dokumenttypdefinition

Eine Dokumenttypdefinition (englisch Document Type Definition), abgekürzt DTD, ist ein Satz an Regeln, der benutzt wird, um Dokumente eines bestimmten Typs zu deklarieren. Ein Dokumenttyp ist dabei eine Klasse ähnlicher Dokumente, wie beispielsweise Telefonbücher oder Inventurdatensätze. Die Dokumenttypdefinition besteht dabei aus Elementtypen, Attributen von Elementen, Entitäten und Notationen. Konkret heißt das, dass in einer DTD die Reihenfolge, die Verschachtelung der Elemente und die Art des Inhalts von Attributen festgelegt wird, also die Struktur des Dokuments.
Eine DTD spezifiziert die Syntax einer Anwendung von SGML oder XML, wie beispielsweise die von ihnen abgeleiteten Sprachen HTML oder XHTML. Diese Syntax ist normalerweise in einer weniger generellen Form gehalten als die SGML- oder XML-Syntax.

## Funktion

Die Syntax und Semantik einer DTD ist Bestandteil der SGML- und XML-Spezifikation. Die DTD wird bereits beim Lesen des Dokumentes geprüft. In SGML muss jedem Dokument zwingend eine DTD zugeordnet sein. In XML ist diese Zuordnung optional. Ein Dokument auf Basis von DTD (<?xml version="1.0"?><!DOCTYPE ...>) gewährleistet die Richtigkeit der angewendeten DTD, also der vorgesehenen Syntax und Semantik. Die Korrektheit der Daten steht hier im Vordergrund. Ein Dokument ohne extern referenzierte DTD oder eingeschlossene DTD wird beim Lesen nur nach der Wohlgeformtheit geprüft. Die schnelle Lesbarkeit steht hier im Vordergrund. Der Inhalt kann von der gewünschten Syntax und Semantik abweichen. Für beide Fälle kann mit zusätzlichen Prozessen die Qualität der Daten nachträglich geprüft werden.
Hinweis: Im Folgenden werden die Beispiele jeweils in XML-Syntax angegeben.

## Dokumenttypdeklaration (DOCTYPE)

Eine Dokumenttypdeklaration stellt die Verbindung zwischen einem Dokument und der DTD her. Die Dokumenttypdeklaration wird am Beginn eines Dokumentes vor dem Wurzelelement angegeben. Die DTD kann als externe Datei referenziert werden (externe DTD) oder aber auch direkt im Dokument eingebunden werden (interne DTD).
Die Syntax für eine Dokumenttypdeklaration lautet in SGML und XML:
In SGML sind zusätzlich auch folgende Varianten ohne System-Identifikator zulässig:
In HTML5 gibt es zwar keine DTD mehr, die Dokumenttypdeklaration existiert aber in einer verkürzten Form weiter:
Der System-Identifikator (SYSTEM), im Beispiel der Eintrag datei.dtd, enthält den Dateinamen der externen DTD. Der Dateiname kann als beliebiger URI angegeben werden.
Der Public-Identifikator (PUBLIC) enthält einen öffentlich bekannten Identifikator für die DTD. Zum Beispiel wird mit dem Identifikator "-//W3C//DTD XHTML 1.0 Strict//EN" die DTD für XHTML eindeutig deklariert. Wenn der Identifikator dem System bekannt ist, verwendet das System die damit assoziierte DTD und lädt nicht die direkt angegebene DTD aus dem System-Identifikator. In Web-Browsern wird so das wiederholte Laden der DTD vermieden.
Der Eintrag [ ... ] kennzeichnet eine interne DTD oder Ergänzungen zu einer DTD.

## Markup-Deklarationen

Innerhalb einer DTD kann die Dokumentstruktur mit Deklarationen von Elementtypen, Attributlisten, Entities und Notationen und Textblöcken definiert werden. Dabei können spezielle Parameter-Entities benutzt werden, die DTD-Teile enthalten und nur innerhalb der DTD erlaubt sind.
Textblöcke sind entweder CDATA oder PCDATA.
Die Strukturelemente (Building Blocks) werden über Attribut-Zuordnungen definiert:
* Element
* Attribut
* Entity
* CDATA
* PCDATA

### CDATA

CDATA (englisch Character Data) kennzeichnet einen ungeparsten Textblock. Die Syntax für einen CDATA-Bereich lautet:
Im Bereich Zeichendaten sind alle Zeichen erlaubt, ausgenommen das Erkennungsmuster für das Ende ]]> des CDATA-Bereiches. Beispiel:
Innerhalb einer Entitätendefinition in XML lautet die Syntax:
In SGML muss das Schlüsselwort CDATA explizit angegeben werden:
Im Bereich Zeichendaten sind alle Zeichen erlaubt, ausgenommen der Endekennung der Zeichenkette " bei "..."-Zeichenketten oder ' bei '...'-Zeichenketten. Beispiel:
Die Zeichendaten &#38; werden vom Parser nicht analysiert.

### PCDATA

Für PCDATA (englisch Parsed Character Data) wird das Schlüsselwort #PCDATA verwendet. Damit wird ein Textblock, der auch weitere Anweisungen an den Parser enthalten kann, gekennzeichnet. Der Inhalt dieses Textblocks wird syntaktisch vom Parser analysiert. Im Gegensatz zu CDATA dürfen nur Zeichen enthalten sein, die keine Tags, Deklarationen oder Verarbeitungsanweisungen einleitet. Verboten sind hier beispielsweise < (z. B. Startzeichen eines Tags, z. B. <Beispiel>).

### Element-Deklarationen (ELEMENT)

Mit einer Elementtyp-Deklaration wird ein Element und sein möglicher Inhalt definiert. In einem validen Dokument dürfen nur Elemente vorkommen, die in der DTD definiert sind.
Der Inhalt eines Elementes kann durch die Angabe anderer Elementnamen und durch einige Schlüsselwörter und Zeichen angegeben werden.
* #PCDATA für Zeicheninhalte (siehe PCDATA)
* EMPTY für keinen Inhalt
* ANY für beliebigen Inhalt
* , für Reihenfolgen
* | für Alternativen (im Sinne „entweder…oder“)
* zum Gruppieren
* * für beliebig oft (aufeinander folgen)
* + für mindestens einmal
* ? für keinmal oder genau einmal
* Wird kein Stern, Pluszeichen oder Fragezeichen angegeben, so muss das Element genau einmal vorkommen

### Attribut-Deklarationen (ATTLIST)

Attribute werden innerhalb einer Attributliste <!ATTLIST Elementname Attributliste> definiert. Die Attributliste enthält durch Leerzeichen oder Zeilenumbrüche getrennt jeweils den Attributnamen, den Typ und Vorgaben der einzelnen Attribute.
Beispiele für Elemente:
* ID
* IDREF und IDREFS
* NMTOKEN und NMTOKENS
* NOTATION und NOTATIONS
* Aufzählungen und NOTATION-Aufzählungen
Mit den Attribut-Vorgaben kann angegeben werden, ob ein Attribut vorkommen muss (#REQUIRED) oder nicht (#IMPLIED) oder einen festen Wert enthält (#FIXED) und welcher Wert als Standardwert benutzt wird, falls das Attribut bei einem Tag nicht angegeben wird.
Vorgabewerte für Attribute :
| #REQUIRED | Das Attribut muss angegeben werden |
| #IMPLIED | Das Attribut ist optional |
| "..." | Standardwert, falls das Attribut weggelassen wird |
| #FIXED "..." | Das Attribut hat immer einen festen Wert |
Beispiel einer Attribut-Deklaration:

### Entitäten-Deklarationen (ENTITY)

Eine Entität ist eine benannte Abkürzung für eine Zeichenkette oder ein externes Dokument, die innerhalb der DTD oder des Dokumentes, verwendet werden kann. Eine Entität der Form &Name; wird dabei durch den deklarierten Inhalt der Entity ersetzt. (Zur allgemeinen Verwendung siehe Entität (Auszeichnungssprache).)
Entitäten bestehen aus Zeichenketten. Diese können selber wieder Entitäten und wohlgeformtes Markup enthalten:
Entitäten können auch für Inhalt einer Datei definiert werden. Dabei wird ein Public- oder System-Identifier benutzt.
Bei externen Entities kann zusätzlich angegeben werden, dass es sich um eine nicht analysierte Entität (NDATA, Nicht-XML/SGML-Daten) handelt. In diesem Fall muss eine Notation angegeben werden (hier "gif").

### Notationsdeklarationen (NOTATION)

Notationen sind Hinweise zur Interpretation von externen Daten, die nicht direkt vom Parser verarbeitet werden. Notationen können sich beispielsweise auf ein Dateiformat für Bilder beziehen.

### NMTOKEN

NMTOKEN (name token) ist mit einem Bezeichner verwandt, geht jedoch freizügiger mit den Regeln zur Namensgebung um. So sind bei einem NMTOKEN Bezeichner mit führender Ziffer oder führendem Punkt erlaubt, wohingegen bei einem Bezeichner nur Buchstaben, Ideogramme und underlines an erster Stelle erlaubt sind. Somit ist jeder Bezeichner auch ein NMTOKEN, jedoch nicht umgekehrt. Beispiele für NMTOKEN:
Deklarations-Beispiel:

### Parameter-Entität

Parameter-Entitäten enthalten eine benannte Zeichenkette, die mittels %Name; an fast allen Stellen innerhalb einer DTD eingesetzt werden kann. Auf diese Weise lassen sich beispielsweise externe Dateien in eine DTD einbinden und mehrfach vorkommende Bestandteile abkürzen. Parameter-Entitäten werden wie normale Entities deklariert, wobei vor dem Elementnamen ein einzelnes Prozentzeichen steht. Beispiel:

### Bedingte Abschnitte

Ein bedingter Abschnitt ist ein Konstrukt, um Deklarationen ein- oder auszuschalten. Beispiel:
Schaltet die Deklaration von hallo ein. Entsprechend gilt:
um hallo auszuschalten.
Man verwendet bedingte Abschnitte wie oben jedoch nicht allein, sondern meist im Zusammenspiel mit Parameter-Entities:
Das Parameter-Entity %weiche; ist durch eine der möglichen Schlüsselwörter INCLUDE oder IGNORE belegt. Je nach Belegung wird das Entity hallo deklariert oder nicht.
Durch diese Art der Schreibweise kann ein bedingter Abschnitt durch Überschreibung von Parameter-Entities angepasst werden.
Beispiel eines kurzen Dokumentes mit Verweis auf eine externe DTD:
In der XML-Deklaration kann im Beispiel auch das Pseudoattribut standalone="no" angegeben werden (d. h., es wird eine externe DTD benötigt):
Der Inhalt von hallo.dtd:
Kurzes Dokument mit interner DTD:
In der XML-Deklaration kann im Beispiel auch das Pseudoattribut standalone="yes" angegeben werden (d. h., es wird keine externe DTD benötigt):