Die Element-Struktur eines XML-Dokuments kann zum Zwecke der Validierung durch Elementtyp- und Attributlisten-Deklarationen beschränkt werden. Eine Elementtyp-Deklaration beschränkt den Inhalt eines Elements.
Elementtyp-Deklarationen beschränken oft, welche Elementtypen als Kinder des Elements erscheinen können. Benutzeroptional kann ein XML-Prozessor eine Warnung ausgeben, falls eine Deklaration einen Elementtyp nennt, für den es keine Deklaration gibt. Dies ist aber kein Fehler.
Eine Elementtyp-Deklaration hat folgende Form:
Elementtyp-Deklaration | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Hierbei bezeichnet Name den zu deklarierenden Elementtyp.
Gültigkeitsbeschränkung: Eindeutige
Elementtyp-Deklarationen
Kein Elementtyp darf
mehr als einmal deklariert werden.
Beispiel für Elementtyp-Deklarationen:
<!ELEMENT br EMPTY> <!ELEMENT p (#PCDATA|emph)* > <!ELEMENT %name.para; %content.para; > <!ELEMENT container ANY>
Ein Elementtyp hat Element-Inhalt, wenn Elemente dieses Typs ausschließlich Kindelemente (keine Zeichendaten) enthalten dürfen, die optional durch Leerraum (Zeichen, die zu dem Nicht-Terminal S passen) unterteilt sind. In diesem Fall enthält die Beschränkung ein Inhaltsmodell, eine einfache Grammatik, die die erlaubten Typen der Kindelemente und die Reihenfolge, in der sie erscheinen dürfen, festlegt. Die Grammatik ist auf Inhaltsteilen (content particles, cps) aufgebaut, die aus Namen, Auswahllisten (choice) und Folgen (sequence) von Inhaltsteilen bestehen.
Modelle für Element-Inhalt | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Hierbei ist Name der Typ eines Elements, das als Kind vorkommen darf. Jeder Inhaltsteil einer Auswahlliste kann im Elementinhalt an der Stelle stehen, an der die Auswahlliste in der Grammatik steht. Inhaltsteile in einer Folge müssen alle im Elementinhalt und in der vorgegebenen Reihenfolge erscheinen. Das optionale Zeichen, das auf einen Namen oder eine Liste folgt, legt fest, ob der Inhalt oder die Inhaltsteile in der Liste einmal oder mehrmals (+), keinmal oder mehrmals (*) bzw. keinmal oder einmal (?) auftreten dürfen. Das Fehlen eines solchen Operators bedeutet, dass das Element oder der Inhaltsteil genau einmal erscheinen muss. Diese Syntax und Bedeutung sind identisch zu denen, die in den Produktionen dieser Spezifikation Verwendung finden.
Der Inhalt eines Elements passt zu einem Inhaltsmodell dann und nur dann, wenn es möglich ist, unter Befolgung der Sequenz-, Auswahl- und Wiederholungsoperatoren einen Pfad durch das Inhaltsmodell zu finden, wobei jedes Element im Inhalt zu einem Elementtyp im Inhaltsmodell passt. Zwecks Kompatibilität ist es ein Fehler, wenn ein Element im Dokument zu mehr als einem Elementtyp im Inhaltsmodell passt. Für weitere Informationen siehe Abschnitt A.11.
Gültigkeitsbeschränkung: Ordentliche
Gruppierung/PE-Verschachtelung
Der
Ersetzungstext von Parameter-Entities muss ordentlich mit
geklammerten Gruppen verschachtelt sein. Das heißt: Wenn
entweder die öffnende oder die schließende Klammer in
einem choice-, seq- oder
Mixed-Konstrukt im Ersetzungstext eines
Parameter-Entity enthalten ist, dann müssen beide in
demselben Ersetzungstext enthalten sein. Zwecks
Zusammenarbeit gilt: Wenn eine Parameter-Entity-Referenz
in einem choice-, seq- oder
Mixed-Konstrukt erscheint, dann sollte dessen
Ersetzungstext nicht leer sein und weder das erste noch
das letzte nicht-leere Zeichen (non-blank) des
Ersetzungstextes sollte ein Konnektor (| oder
,) sein.
Beispiele für Modelle mit Element-Inhalt:
<!ELEMENT spec (front, body, back?)> <!ELEMENT div1 (head, (p | list | note)*, div2*)> <!ELEMENT dictionary-body (%div.mix; | %dict.mix;)*>
Ein Element hat gemischten Inhalt, wenn Elemente dieses Typs Zeichendaten enthalten dürfen, die optional mit Kindelementen gemischt sind. In diesem Fall können die Typen der Kindelemente beschränkt werden, nicht jedoch ihre Reihenfolge oder ihre Anzahl.
Deklaration von gemischtem Inhalt | |||||
---|---|---|---|---|---|
|
Dabei bezeichnet Name den Elementtyp, der als Kind erscheinen darf.
Gültigkeitsbeschränkung: Keine
doppelten Typen
Derselbe Name darf nicht
mehr als einmal in einer Deklaration von gemischtem Inhalt
erscheinen.
Beispiel für Deklarationen von gemischtem Inhalt:
<!ELEMENT p (#PCDATA|a|ul|b|i|em)*> <!ELEMENT p (#PCDATA | %font; | %phrase; | %special; | %form;)* > <!ELEMENT b (#PCDATA)>