XML-Know How

Elemente in der DTD

In der DTD werden Elemente wie folgt definiert (»deklariert«):

<!ELEMENT elementname inhaltsmodell>

Ein Beispiel:

<!ELEMENT kapitel (überschrift, absatz+)>

Die Element-Deklaration steht in spitzen Klammern. Die Zeichenfolge !ELEMENT zeigt an, dass hier ein Element deklariert wird. Es folgt der Name des zu deklarierenden Elementes, hier kapitel. Anschließend erfolgt die Angabe des Elementinhalts (Content Model).

Hierfür gibt es vier Varianten: ANY, #PCDATA, EMPTY und die genauere Festlegung des Inhalts in Klammern wie in obigem Beispiel. ANY heißt, dass das Element alle anderen in derselben DTD deklarierten Elemente in beliebiger Mischung enthalten darf, #PCDATA erlaubt nur Text als Inhalt und EMPTY definiert ein leeres Element:

<!ELEMENT überschrift (#PCDATA)>
<!ELEMENT grafik EMPTY>
<!ELEMENT alles ANY>

Für eine präzisere Definition des Content Model gibt es in XML folgende Möglichkeiten:

Angabe der Reihenfolge der Elemente (wenn ein Element weitere enthält)

  • UND-Konnektor: alle mit »,« getrennte Elemente müssen genau
    in der beschriebenen Reihenfolge vorkommen: (A,B,C)
  • ODER-Konnektor: genau eines der mit »|« getrennte Elemente muss
    vorkommen: (A|B|C)

Beispiele:

<!ELEMENT kapitel (überschrift, textteil)>
<!ELEMENT textteil (absatz | grafik)>

Angabe der erlaubten Häufigkeit der Elemente

  • keine Angabe Das Objekt ist obligatorisch,
    es muss genau einmal auftreten.
  • »?« Das Objekt ist optional,
    kann also nicht oder genau einmal auftreten.
  • »*« Das Objekt ist optional und wiederholbar,
    kann also nicht oder beliebig oft auftreten.
  • »+« Das Objekt ist obligatorisch und wiederholbar,
    muss also mindestens einmal oder beliebig oft auftreten.

Beispiel:

<!ELEMENT kapitel (überschrift?, absatz+, anhang*)>

Die Angaben zu Reihenfolge und Häufigkeit können durch Klammern kombiniert werden:

<!ELEMENT kapitel (überschrift?, (absatz | grafik)+, anhang*)>

In diesem einfachen Beispiel kann das kapitel-Element maximal eine Überschrift haben, diese ist aber optional. Wenn eine Überschrift vorkommt, muss sie an erster Stelle stehen. Es folgen mindestens ein oder beliebig viele Absätze oder Grafiken, die in beliebigem Wechsel auftreten dürfen. Das Kapitel kann anschließend beliebig viele Anhänge oder gar keinen haben.

Durch die intensive Nutzung des Klammerungsmechanismus können höchst komplexe Inhaltsmodelle genau abgebildet werden.

Bei Mixed Content gelten folgende Besonderheiten:

     

  • #PCDATA muss immer an erster Stelle der Inhaltsbeschreibung stehen
    (andernfalls gibt es einen Parserfehler).
  • #PCDATA und Elemente müssen in der Inhaltsbeschreibung
    mit »|« verknüpft werden.
  • Die gesamte Mixed Content-Gruppe muss optional sein und
    beliebig oft vorkommen dürfen (es ist also nur der »*«-Operator zulässig).
  • Weder die Anzahl noch die Reihenfolge der Child-Elemente
    eines Mixed-Content-Elements können daher genauer festgelegt werden.
  •  

Beispiel in DTD:

<!ELEMENT absatz (#PCDATA | autor | literar.person | histor.person)*>

Die Mixed Content-Problematik finden Sie noch detaillierter im Beitrag SGML als »XML-Erweiterung« in Redaktion, Herstellung und Satz dargestellt.

Eine DTD für das XML-Dokument buch:

<buch>
<kapitel>
<überschrift>
Text der Überschrift</überschrift>
<absatz>
Text des Absatzes</absatz>
<absatz>
Text des Absatzes</absatz>
<grafik/>
<absatz>
Hier ist <wissenschaftler>Meier</wissenschaftler> ganz anderer Aufassung.</absatz>
<grafik/>
</kapitel>
</buch>

könnte also wie folgt aussehen:

<!ELEMENT buch (kapitel)+>
<!ELEMENT kapitel (überschrift?, (absatz | grafik)+)>
<!ELEMENT überschrift (#PCDATA)>
<!ELEMENT absatz (#PCDATA | wissenschaftler)*>
<!ELEMENT grafik EMPTY >
<!ELEMENT wissenschaftler (#PCDATA)>

Weitere Angaben werden in der DTD nicht benötigt. Auch die Reihenfolge der Deklarationen ist beliebig.