Attribut-Datentypen

Attribut-Datentypen bestimmen, welchen Inhalt ein Attribut annehmen kann. Sie werden in der DTD mittels der ATTLIST-Deklaration festgelegt. In XML gibt es folgende Attribut-Datentypen:

  • beliebige Zeichenketten mit Whitespace (CDATA)
  • eine zusammenhängende Zeichenkette aus Ziffern, Buchstaben
    und ».«, »_« sowie »-« (NMTOKEN) oder mehrere solche Zeichenketten (NMTOKENS)
  • eine eindeutige ID (ID)
  • eine Referenz auf eine solche ID (IDREF) oder
    mehrere davon (IDREFS)
  • eine Auflistung konkreter Werte, die im Attribut stehen dürfen,
    auch mit Default-Wert (Enumeration); z. B.: (a|b|c) "a"
  • Referenzen auf in der DTD deklarierte Entities (ENTITY/ENTITIES)
    und Notationen (NOTATION/NOTATIONS) – eher selten verwendet

Das heißt vor allem: Sie können nicht festlegen, dass ein Attribut nur Zahlen oder nur Buchstaben enthalten darf. SGML kennt weitere Attribut-Datentypen mit engerer Inhaltsdefinition. Die SGML-Attributtypen, die man ohne Risiko in XML-Dokumenten verwenden kann, sind

  • NUMBER: eine Ziffernkette oder (NUMBERS) mehrere davon
  • NUTOKEN: eine Ziffernkette, die auch ».«, »_« und »-« enthalten darf,
    oder mehrere solche Ziffernketten (NUTOKENS)
  • NAME: Zeichenkette aus Buchstaben, Ziffern, ».«, »-« und »_«; muss mit Buchstaben beginnen, oder (NAMES) mehrere solche Ziffernketten

Für die XML-Erweiterung sind vor allem NUMBER und NUTOKEN von Interesse, da Ersteres die Beschränkung auf Ziffern garantiert; Letzteres für das Sichern der Einhaltung von Datumsformaten u. ä. geeignet ist.

Die Einhaltung von genau bestimmten Datumsformaten ist durch NUTOKEN leider nicht möglich: "03.04.2003" ist als NUTOKEN genauso korrekt wie "_..7-5". Bessere Alternativen für Daten mit festgelegter Form sind daher immer noch Aufzählungs-Attribute; z. B. getrennt für Tag, Monat und Jahr mit den jeweils erlaubten Werten oder für das komplette Datum mit allen erlaubten Werten z. B. von "01.01.1900" bis "31.12.2020". Eleganter geht es nur mit einem ganz anderen Ansatz, nämlich mit XML-Schema, das die Definition von eigenen Daten-Formaten erlaubt.

Sind Sie aber auf DTDs beschränkt und finden z. B. eine Kunden-XML-DTD vor, die für Datumsangaben der Form »TT.MM.JJ« ein NMTOKEN-Attribut verwendet, gehen Sie sicherer, wenn Sie dieses Attribut in einer SGML-DTD-Variante als NUTOKEN umdeklarieren. So erwischen Sie wenigstens schwere Ausnahmen wie "23. Aug. 2001" beim Parsen.

Die XML-Attributdatentypen ID und IDREF sind formal vom Typ NAME (darum »meckert« jeder Parser, wenn man als ID nur eine Zahl nehmen will, was ja durchaus nahe liegend erscheint). Sie können also beim Bearbeiten von Teildokumenten, in denen für IDREFs die IDs fehlen (weil sie in einem anderen Teildokument stehen, z. B. bei Querverweisen) Fehlermeldungen durch die provisorische Verwendung von NAME statt IDREF vermeiden. So behalten Sie auch eine gewisse formale Kontrolle über die IDREFs.

Und so deklarieren Sie die SGML-Attribute um, wenn Sie wieder in einer reinen XML-DTD arbeiten müssen (natürlich unter Verlust der SGML-Kontrollmöglichkeiten): NUMBER(S), NUTOKEN(S) und NAME(S) können als NMTOKEN(S) deklariert werden. NAME(S) auch als ID oder IDREF(S).


Fazit

  • Mehr und genauer definierte Attribut-Typen in SGML ermöglichen Ihnen
    eine genauere Kontrolle von Attributwerten in XML-Daten.