Dokumenttypdefinition


aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Dokumenttypdeklaration)
Wechseln zu: Navigation, Suche
25px DTD ist eine Weiterleitung auf diesen Artikel. Weitere Bedeutungen sind unter DTD (Begriffsklärung) aufgeführt.

Eine Dokumenttypdefinition (englisch document type definition, DTD, auch Schema-Definition oder DOCTYPE) 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 – kurz gesagt: die Struktur des Dokuments.

Der Begriff wird auch für konkrete DTD-Implementationen benutzt, denn DTD ist innerhalb der SGML-/XML-Spezifikationen beschrieben. Für XML-Dokumente existieren verschiedene andere Schemasprachen, um Dokumenttypdefinitionen auszudrücken; die bekanntesten sind XML Schema (XSD) und RELAX NG.

Eine DTD spezifiziert als Ausdruck eines Schemas 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.

DTD in XML

Die Syntax und Semantik einer DTD ist Bestandteil der XML-Spezifikation. Diese Entscheidung wurde später kritisiert, da die DTD-Syntax selbst kein XML ist. Mit Document Schema Definition Languages existiert eine eigene Spezifikation zur Definition von Dokumentstrukturen, Datentypen und Datenbeziehungen in strukturierten Informationsquellen.

Dokumenttypdeklaration

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

<syntaxhighlight lang="text"> <!DOCTYPE Wurzelelement SYSTEM "datei.dtd" [ … ]> <!DOCTYPE Wurzelelement PUBLIC "Public Identifier" "datei.dtd" [ … ]> <!DOCTYPE Wurzelelement [ … ]> </syntaxhighlight>

Als Verweis auf eine Datei kann ein beliebiger URI angegeben werden. Für standardisierte DTDs gibt es bekannte Public Identifier (zum Beispiel "-//W3C//DTD XHTML 1.0 Strict//EN" für XHTML), so dass Programme nicht jedes Mal die Datei neu zu laden brauchen, 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 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 ungeparster Text, CDATA oder PCDATA.

Die Strukturelemente (Building Blocks) werden über Attribut-Zuordnungen definiert:

  • Element
  • Attribut
  • Entity
  • CDATA
  • PCDATA

PCDATA

PCDATA ist das Schlüsselwort für einen Textblock, der auch weitere Anweisungen an den Parser enthalten kann – anders als CDATA. Der Inhalt dieses Textblocks wird also ebenfalls syntaktisch vom Parser analysiert. PCDATA wird für gemischte Inhalte des Dokuments verwendet; also solche, die auch andere Elemente oder Textblöcke enthalten können.

Die Bezeichnung PCDATA steht für parsed character data, ist allerdings ziemlich irreführend. Sie stammt noch aus SGML.

Elementtyp-Deklarationen

Mit einer Elementtyp-Deklaration wird ein Element und sein möglicher Inhalt definiert. In einem validen 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“)
  • () zum Gruppieren
  • * für beliebig oft
  • + für mindestens einmal
  • ? für keinmal oder genau einmal
  • Wird kein Stern, Pluszeichen oder Fragezeichen angegeben, so muss das Element genau einmal vorkommen

<syntaxhighlight lang="text"> <!ELEMENT html (head, body)> <!ELEMENT hr EMPTY> <!ELEMENT div (#PCDATA | p | ul | ol | dl | table | pre | hr |

         h1|h2|h3|h4|h5|h6 | blockquote | address | fieldset)*>

<!ELEMENT dl (dt|dd)+> </syntaxhighlight>

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.

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 XML-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

<syntaxhighlight lang="text"> <!ATTLIST img

  id     ID       #IMPLIED
  src    CDATA    #REQUIRED
  alt    CDATA    #REQUIRED
  ismap  IDREF  #IMPLIED

> </syntaxhighlight>

Entity-Deklarationen

Eine Entity ist eine benannte Abkürzung für eine Zeichenkette oder ein externes Dokument, die innerhalb der DTD oder des XML-Dokumentes, das diese DTD benutzt, verwendet werden kann. Eine Entity-Referenz der Form &Name; wird dabei durch den Inhalt der Entity ersetzt. (Zur allgemeinen Verwendung siehe Entitäten in Auszeichnungssprachen.)

Interne Entities bestehen aus Zeichenketten. Diese können selber wieder Entity-Referenzen und wohlgeformtes XML-Markup enthalten: <syntaxhighlight lang="text"> <!ENTITY name "Benedikt"> <!ENTITY papst "&name;, der XVI."> <!ENTITY wplink "<a href='http://de.wikipedia.org'>Wikipedia</a>"> </syntaxhighlight>

Externe Entities bestehen aus dem Inhalt einer Datei, auf die verwiesen wird. Dabei kann wieder ein Public- oder System-Identifier benutzt werden. <syntaxhighlight lang="text"> <!ENTITY kapitel1 SYSTEM "kapitel1.xml"> <!ENTITY wichtig PUBLIC "-//privat//WICHTIG//" "wichtig.xml"> </syntaxhighlight>

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").

<syntaxhighlight lang="text"> <!ENTITY bild SYSTEM "../grafiken/bild.gif" NDATA gif> </syntaxhighlight>

Notationsdeklarationen

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

<syntaxhighlight lang="text"> <!NOTATION Datentyp SYSTEM "URL"> <!NOTATION Datentyp PUBLIC "Identifikator"> </syntaxhighlight>

NMTOKEN-Deklarationen

NMTOKEN (name token) ist mit einem XML-Namen verwandt, geht jedoch freizügiger mit den Regeln zur Namensgebung um. So sind bei einem NMTOKEN Namen mit führender Ziffer oder führendem Punkt erlaubt, wohingegen bei einem XML-Namen nur Buchstaben, Ideographen und underlines an erster Stelle erlaubt sind. Somit ist jeder XML-Name auch ein NMTOKEN, jedoch nicht umgekehrt.
Beispiele für NMTOKEN: <syntaxhighlight lang="xml"> 12alpha .crc </syntaxhighlight> Deklarations-Beispiel: <syntaxhighlight lang="text"> <!ATTLIST birthdate

   year NMTOKEN #REQUIRED

> </syntaxhighlight>

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

<syntaxhighlight lang="text"> <!ENTITY % datei SYSTEM "andere-datei.ent"> %datei;

<!ENTITY % foo.inhalt "(bar|doz)*"> <!ELEMENT foo %foo.inhalt;> </syntaxhighlight>

Bedingte Abschnitte

Ein bedingter Abschnitt ist ein Konstrukt, um Deklarationen ein- oder auszuschalten. Beispiel:

<syntaxhighlight lang="text"> <![INCLUDE[

 <!ENTITY hallo "welt">

]]> </syntaxhighlight>

Schaltet die Deklaration von hallo ein. Entsprechend gilt:

<syntaxhighlight lang="text"> <![IGNORE[

 <!ENTITY hallo "welt">

]]> </syntaxhighlight> um hallo auszuschalten.

Man verwendet bedingte Abschnitte wie oben jedoch nicht allein, sondern meist im Zusammenspiel mit Parameter-Entities:

<syntaxhighlight lang="text"> <!ENTITY % weiche "INCLUDE"> <![%weiche;[

 <!ENTITY hallo "welt">

]]> </syntaxhighlight>

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

Kurzes XML-Dokument mit Verweis auf eine externe DTD: <syntaxhighlight lang="text"> <?xml version="1.0" standalone="no"?> <!DOCTYPE hallo SYSTEM "hallo.dtd"> <hallo>Hallo Welt!</hallo> </syntaxhighlight>

Der Inhalt von "hallo.dtd": <syntaxhighlight lang="text"> <!ELEMENT hallo (#PCDATA)> </syntaxhighlight>

Kurzes XML-Dokument mit interner DTD: <syntaxhighlight lang="xml"> <?xml version="1.0" standalone="yes"?> <!DOCTYPE hallo [<!ELEMENT hallo (#PCDATA)>]> <hallo>Hallo Welt!</hallo> </syntaxhighlight>

Weblinks