Der AND-Konnektor »&«

Mit Konnektoren legen Sie in der DTD fest, wie die Elemente miteinander verbunden sein sollen. In XML stehen Ihnen zwei Möglichkeiten zur Verfügung:

  • festgelegte Reihenfolge mit »,« (SEQ-Konnektor)
  • Alternativenangabe mit »|« (OR-Konnektor).

In Kombination mit den verschiedenen Häufigkeitsangaben (auch Kardinalitäten oder occurence indicators genannt)

  • »?« (optional, nicht wiederholbar)
  • »+« (obligatorisch, wiederholbar) und
  • »*« (optional, wiederholbar),

sowie durch Schachtelung mit Klammerkonstruktionen können Sie auch komplexere Elementkombinationen mit vielfältigen, aber genau festgelegten Anordnungen definieren.

Wollen Sie aber mehrere Elemente in beliebiger Reihenfolge anordnen, können Sie entweder alle konkreten Möglichkeiten als alternative Reihungen definieren:

<!ELEMENT abc ( (a,b,c)|(b,c,a) ... )>

oder Sie definieren eine Alternative der Elemente, die sich aber beliebig wiederholen darf:

<!ELEMENT abc (a|b|c)+>

Die erste Lösung kann wegen der hohen Variantenzahl sehr schnell sehr aufwändig werden (die Deklaration eines Elementes abc als »alle Buchstaben des Alphabets müssen vorkommen, aber die Reihenfolge ist beliebig« würde die Deklaration von 403 291 461 126 605 635 584 000 000 Varianten erfordern). Die zweite Lösung dagegen erlaubt das mehrfache Vorkommen aller Elemente und ihr Fehlen gleichermaßen. Beides ist unerfreulich und in XML nicht zu beheben.

SGML stellt Ihnen mit dem AND-Konnektor eine einfache Lösung zur Verfügung. Mit »&« verbundene Elemente können in beliebiger Reihenfolge auftreten, müssen aber vorkommen. Dieses »Muss« können Sie mit den Häufigkeitsangaben wieder aufheben (per »?« – »kann auch fehlen«) oder erweitern (per » – »kann beliebig oft vorkommen«; »*« – »kann auch fehlen oder beliebig oft vorkommen«).

Typische Anwendungsfälle sind etwa internationale Personennamen und Bibliographien. Unterschiedliche Namensysteme oder Werktypen mit unterschiedlicher Reihenfolge ihrer Elemente machen ein sehr einfaches Schema problematisch, andererseits müssen bestimmte Elemente vorkommen, um Mindestanforderungen an Durchsuchbarkeit und Sortierbarkeit zu erhalten (etwa Hauptname und Nebenname bei Personen oder Werktitel bei Büchern).

Ein einfaches Beispiel: beide Teile müssen auftreten, Reihenfolge ist beliebig:

<!ELEMENT name (vorname & nachname)>

Ein komplexeres Beispiel: in einer internationalen Fachzeitschrift soll jeder Autor seinen Namen und Zusätze wie akademische Grade beliebig positionieren können, so, wie er es in seiner Kultur gewohnt ist. Zugleich sollen die wichtigsten Bestandteile eindeutig identifiziert werden können, z. B. für ein sortiertes Autorenverzeichnis. Ein Lösungsvorschlag könnte so aussehen:

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

hauptname und nebenname müssen vorhanden sein, wobei der nebenname mehrfach auftreten kann, abstammung und diverses können einmal vorkommen oder fehlen, akad.grad kann beliebig oft vorkommen oder fehlen. Die Reihenfolge ist beliebig. Mehrfach erlaubte Elemente können übrigens nur an einer beliebigen Stelle mehrfach vorkommen, nicht an verschiedenen gleichzeitig.

So geht es (mehrere diverses-Elemente an einer Stelle):

<name>
<fam.name>
Bayer</fam.name>
<nebenname>
Friedel</nebenname>
<diverses>
O.M.</diverses>
<diverses>
Stipendiat</diverses>
</name>

eine andere Lösung ist folgende (mehrere diverses-Elemente an einer anderen Stelle):

<name>
<fam.name>
Bayer</fam.name>
<diverses>
O.M.</diverses>
<diverses>
Stipendiat</diverses>
<nebenname>
Friedel</nebenname>
</name>

So aber nicht (mehrere diverses-Elemente an verschiedenen Stellen):

<name>
<fam.name>Bayer</fam.name>
<diverses>
O.M.</diverses>
<nebenname>
Friedel</nebenname>
<diverses>
Stipendiat</diverses>
</name>

Auch diese Einschränkung kann in SGML umgangen werden (mit Inklusion, s. u.).

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

Am einfachsten und immer richtig sind ODER-Alternativen, die sich beliebig wiederholen:

<!ELEMENT abc (a|b|c)*>

Genauer, aber aufwändiger sind alternative Reihungen:

<!ELEMENT abc (a,b,c)|(b,c,a) ...)>

Oder aber Sie wählen individuelle Konstruktionen mit »|«- und »,«-Konnektoren.


Fazit

  • In XML können Sie flexible Element-Reihungen nur mit sehr viel Aufwand
    oder aber unter Verzicht auf genauere Struktur-Vorgaben definieren.
  • Mithilfe des AND-Konnektors können in SGML Inhaltsmodelle
    definiert werden, die bei einfacher Verwendbarkeit die gleiche Flexibilität,
    aber ein viel genaueres Regelwerk aufweisen, als es die in XML
    vorhandenen Konnektoren ermöglichen.