Dokumenttypdefinition

Deklarationsteil zu einem ausgezeichneten Dokument
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 6. November 2003 um 15:29 Uhr durch 212.8.199.227 (Diskussion). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Die Document Type Definition (DTD, dt. Dokumenttyp-Definition) ist eine Deklaration in SGML- und XML-Dokumenten, die die Struktur eines solchen Dokuments festlegt.

Eine DTD beschreibt z.B. HTML oder XHTML; verbreitet sind auch DTDs für spezielle Einsatzgebiete wie XSL, DocBook oder TEI (Text Encoding Initiative).

In einer DTD werden Elemente (engl. elements, z.B. XML-Elemente), Attribute von Elementen (engl. attributes, z.B. XML-Attribute), Entitäten (engl. entities, z.B. XML-Entitäten) und, dies ist nur bei bestimmten SGML-Deklarationen (engl. SGML declaration) möglich, Besonderheiten der Syntax-Verwendnung (z.B. Abkürzungen oder lokale Umdefinitionen von Zeichen). Konkret heißt das, dass in einer DTD beispielsweise die Reihenfolge der Elemente oder die Art des Inhalts von Attributen festgelegt wird bzw. werden kann.

DTD in XML

Die Syntax und Semantik einer DTD ist Bestandteil des XML-Standards. Diese Entscheidung wurde später kritistiert, da die DTD-Syntax selber kein XML ist. Mit XML Schema existiert ein eigener Standard zur Definition von Dokumenttypen für XML-Dokumente. XML Schemas werden in einer XML-Syntax formuliert, bieten mehr Möglichkeiten und sind allerdings auch komplexer als DTDs.

Dokumenttyp-Deklaration

Die DTD wird zu Beginn eines XML-Dokumentes, vor dem Wurzelelement, in der Dokumenttyp-Deklaration angegeben. Die Grammatikregeln der DTD können dabei sowohl innerhalb des XML-Dokumentes (interne DTD) als auch in einer externen Datei angeben werden (drei Möglichkeiten und die eckigen Klammern können weggelassen werden, falls sie leer sind):

 <!DOCTYPE Wurzelelement SYSTEM "datei.dtd" [ ... ]>
 <!DOCTYPE Wurzelelement PUBLIC "Public Identifier" "datei.dtd" [ ... ]>
 <!DOCTYPE Wurzelelement [ ... ]>

Als Verweis auf eine Datei kann eine beliebige URI angegeben werden. Für standarisierte DTDs gibt bekannte Public Identifier (z.B. "-//W3C//DTD XHTML 1.0 Strict//EN" für XHTML), so dass Programme nicht jedesmal die Datei neu laden müssen, falls ihnen der Public Identifier bekannt ist

Innerhalb einer DTD-Datei bzw. der eckigen Klammern können verschiedene Markup-Deklarationen stehen, die den Dokumenttyp definieren.

Markup-Deklarationen

Innerhalb einer DTD kann die Dokumentstruktur mit Deklarationen von Elementtypen, Attributlisten, Entities und Notationen definiert werden. Dabei können spezielle Parameter-Entities benutzt werden, die DTD-Teile enthalten und nur innerhalb der DTD erlaubt sind.

Elementtyp-Deklarationen

Mit einer Elementtyp-Deklaration wird ein Element und sein möglicher Inhalt definiert. In einem validem XML-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.

  • EMPTY für keinen Inhalt
  • ANY für beliebigen Inhalt
  • , für Reihenfolgen
  • | für Alternativen (im Sinne "entweder...oder")
  • Runde Klammern zum Gruppieren
  • Der Stern für keinmal oder beliebig oft
  • Das Pluszeichen für einmal oder beliebig oft
  • Das Fragezeichen für keinmal oder genau einmal
  • Wird kein Stern, Pluszeichen oder Fragezeichen angegeben, so muß das Element genau einmal vorkommen
 <!ELEMENT html (head,body)>
 <!ELEMENT hr EMPTY>
 <!ELEMENT p (#PCDATA | p | ul | ol | dl | table | pre | hr |
              h1|h2|h3|h4|h5|h6 | blockquote | address | fieldset)*>
 <!ELEMENT dl (dt|dd)+>

Attributlisten-Deklarationen

Die Liste der möglichen Attribute eines Elementes wird in einer DTD mit <!ATTLIST Elementname Attributliste> angegeben. Die Attributliste enthält durch Leerzeichen oder Zeilenumbrüche getrennt jeweils den Namen, den Typ und Vorgaben eines Attributes.

Es gibt folgende Attributtypen

  • CDATA
  • ID
  • IDREF und IDREFS
  • NMTOKEN
  • ENTITY und ENTITIES
  • 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 XML-Tag nicht angegeben wird.

 <!ATTLIST img 
    id     ID       #IMPLIED
    src    CDATA    #REQUIRED
    alt    CDATA    #IMPLIED
    ismap  (ismap)  #IMPLIED
 >

Entity-Deklarationen

Eine Entity ist eine benannte Abkürzung für eine Zeichenkette oder ein externes Dokument, dass innerhalb der DTD oder des XML-Dokumentes, das diese DTD benutzt, verwendet werden kann. Eine Entity-Referenz der Form &Name; wird dabei durch dem Inhalt der Entity ersetzt.

Interne Entities bestehen aus Zeichenketten. Diese können selber wieder Entity-Referenzen und wohlgeformtes XML-Markup enthalten:

 <!ENTITY name   "Johannes Paul">
 <!ENTITY papst  "&name;, der II.">
 <!ENTITY wplink "<a href='http://de.wikipedia.org'>Wikipedia</a>">

Externe Entities bestehen aus dem Inhalt einer Datei, auf die Verweisen wird. Dabei kann wieder ein Public Identifier benutzt werden.

 <!ENTITY kapitel1 SYSTEM "kapitel1.xml">
 <!ENTITY wichtig PUBLIC "-//privat//WICHTIG//" "wichtig.xml">

Bei externen Entities kann zusätzlich angegeben werden, dass es sich um eine nicht analysierte Entity handelt, deren Inhalt aus beliebigen Daten besteht, die durch eine Entity-Referenz nicht ersetzt werden müssen. In diesem Fall muss eine Notation angegeben werden (hier "gif").

 <!ENTITY bild SYSTEM "../grafiken/bild.gif" NDATA gif>

Notation-Deklarationen

...

Parameter-Entities

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 Entities werden wie normale Entities deklariert wobei vor dem Elementnamen ein einzelnes Prozentzeichen steht. Beispiel:

 <!ENTITY % datei SYSTEM "andere-datei.ent">
 %andere-datei;
 <!ENTITY % foo.inhalt "(bar|doz)*">
 <!ELEMENT foo %foo.inhalt;>

Sonstiges

Bedingte Abschnitte, externe Entitäten und nicht-validierende Parser

Beispiel

Kurzes XML-Dokument mit Verweis auf ein DTD

<?xml version="1.0"?>
<!DOCTYPE hallo SYSTEM "hallo.dtd"> <!-- extern -->
<hallo>Hallo Welt!</hallo>

Der Inhalt des dazupassenden DTDs

<?xml version="1.0"?>
<!DOCTYPE hallo  [
<ELEMENT hallo (#PCDATA)> <!-- intern -->
]>
<hallo>Hallo Welt!</hallo>