Mixed Content

Soll Text mit Auszeichnungen versehen werden, benötigen Sie Mixed Content: Zeichendaten (PCDATA) und Elemente dürfen gemischt in einem Blockelement auftreten:

<absatz>Das ist ein <stichwort>Beispiel</stichwort>.
</absatz>.

XML stellt hier nur eine Konstruktion zur Verfügung, nämlich eine sich beliebig wiederholende Auswahl mit #PCDATA als zuerst genanntem Element (alle anderen Konstruktionen mit #PCDATA sind illegal):

<!ELEMENT ABC (#PCDATA | A | B | C)*>

Diese Konstruktion hat schwere Nachteile: Reihenfolge und Vorkommen der Elemente sind beliebig.

Wollten Sie bei dem obigen Strukturmodell erlauben, zwischen den Bestandteilen von name Text einzugeben, z. B. um individuell gesetzte Kommas, Klammern oder Bindewörter zwischen Namen und nach- oder vorangestellten akademischen Graden zuzulassen, müssten Sie in XML deklarieren:

<!ELEMENT name (#PCDATA | hauptname | nebenname | abstammung | akad.grad | diverses)*>

Resultat ist der Verlust jeder Kontrolle über den Inhalt von name: alle Elemente können nun fehlen oder beliebig oft vorkommen.

In SGML dagegen kann PCDATA wie ein Element verwendet werden: es kann in Reihungen an bestimmter Stelle stehen oder in AND-Modellen verwendet werden. So kann die Reihung und das Vorkommen von Elementen innerhalb von Mixed Content genauer definiert werden.

Die folgende Deklaration, die SGML-Variante des obigen XML-Beispiels, erlaubt es ohne Nebeneffekte, zwischen den einzelnen Bestandteilen Text einzufügen:

<!ELEMENT name (
(hauptname, #PCDATA) & (nebenname, #PCDATA)+ & (abstammung, #PCDATA)? & (akad.grad, #PCDATA)* & (diverses, #PCDATA)*
)
>

So kann ein Autor schreiben

<name><nebenname>Fritz</nebenname> <hauptname>Friese
</hauptname></name>

ein anderer dagegen

<name><hauptname>Bayer</hauptname>, <nebenname>Friedel
</nebenname></name>

Ein anderes Beispiel: ein Deutscher kann seine akademischen Grade ohne Komma vor seinen Namen stellen, der Angelsachse wird sie, durch ein Komma getrennt, nachstellen.

Und so deklarieren Sie die Mixed Content-Konstruktionen um, wenn Sie wieder in einer reinen XML-DTD arbeiten müssen:

Per ODER-Alternative mit #PCDATA an erster Stelle und »*« als Häufigkeitsangabe:

<!ELEMENT ABC-Text (#PCDATA | A | B | C)*>


Fazit

  • Sobald Text und Tags in XML gemischt werden müssen, verlieren Sie die Kontrolle über die Verwendung der Tags. Das flexiblere Mixed Content-Modell von SGML gibt Ihnen in Verbindung mit dem AND-Konnektor diese Kontrolle zurück.