20.7.2 | Kennzeichnung mit speziellen Attributen |
Insbesondere dann, wenn eine DTD noch in der Entwicklung steht oder wenn eine XML-Applikation mehrere DTDs verarbeiten können soll, ist der Ansatz der festen Kodierung der Elementnamen zu unflexibel. Als Alternative kann man einen Satz von Attributen definieren, der allen Elementen hinzugefügt wird, die Binärdaten referenzieren sollen. In der XML-Applikation wird dann bei jedem Elementknoten geprüft, ob diese speziellen Attribute gesetzt sind.
Das folgende Beispiel definiert ein Attribut BINDATA, das einen Dateinamen einer Bilddatei oder eines Audioclips aufnehmen soll. Um die mehrfache Verwendung des Attributsatzes zu vereinfachen, bietet es sich an, ihn als Parameter-Entity zu definieren:<!ENTITY % BINDATA-ATTR "BINDATA CDATA #REQUIRED BINDATATYPE (img|sound) #FIXED>Das Attribut BINDATA dient so als Flag zur Kennzeichnung von Elementen, die Binärdaten referenzieren. Anstatt die Elementnamen fest in der XML-Applikation einzutragen, sucht die XML-Applikation nach diesem Attribut. Findet sie dieses Attribut vor, geht sie davon aus, dass das Element Binärdaten referenziert und fragt die Werte von BINDATA und BINDATATYPE ab. Letzteres dient dazu, der Applikation zu signalisieren, um welchen Typ von Binärdaten es sich handelt. In diesem Beispiel wird davon ausgegangen, dass ein mit diesem Attributsatz definiertes Element immer nur einen bestimmten Typ einbindet. Daher wird der Typ als FIXED vereinbart.
Wenn man nun ein Element IMAGE zur Einbindung von Bildern definieren möchte, braucht man ihm nur den zuvor definierten Attributsatz zu geben:<!ELEMENT IMAGE EMPTY> <!ATTLIST IMAGE % BINDATA-ATTR; "img">Zunächst wird die Parameter-Entity BINDATA-ATTR referenziert. Diese enthält in der zweiten Zeile die unvollständige Definition eines FIXED-Attributs. Unvollständig deshalb, weil hinter FIXED noch der fixierte Wert fehlt. Dieser wurde in der Definition von BINDATA-ATTR bewusst ausgelassen, da er erst in den Elementen gesetzt werden soll, die BINDATA-ATTR einbauen, hier also bei IMAGE. Erst in der ATTLIST von IMAGE wird hinter %BINDATA-ATTR der Vorgabewert "img" gesetzt, um zu signalisieren, dass dieses Element Bilddaten einbindet.
In einem Dokument würde IMAGE dann folgendermaßen verwendet:<IMAGE BINDATA="portrait.gif">Die Applikation findet bei der Traversierung des Parse-Baums dann das BINDATA-Attribut vor und kann an dem Wert des fixierten Attributs BINDATATYPE erkennen, dass es sich um eine Bilddatei handelt. Daraufhin kann sie die nötigen Aktionen starten, um die Bilddatei einzubinden.