20.5.2 | Attribute |
Attribute sind Name-Wert-Paare, die nur im Start-Tag (bzw. in Leeres-Element-Tags) angegeben werden können. Jedes Attribut hat einen Typ. Die wohl am häufigsten verwendeten Typen sind:Zusätzlich zu Name und Typ muss eine Attributdeklaration mit einer Angabe versehen sein, mit der festgelegt wird, ob ein Attribut explizit angegeben werden muss und welchen Vorgabewert es hat. Folgende Zusätze sind möglich:
- CDATA
Beim Typ CDATA kann das Attribut beliebige Zeichendaten aufnehmen.- ID
Bei Attributen vom Typ ID prüft der Parser, ob der Wert eindeutig im gesamten Dokument ist, und zwar übergreifend über alle Elemente, die ein Attribut vom Typ ID vereinbaren. Dieser Attributtyp eignet sich gut für Referenzierungen innerhalb des Dokuments, z. B. Verweise.Jedes Element kann höchstens ein Attribut vom Typ ID definieren. Falls es erforderlich ist, mehrere IDs angeben zu können, muss der Typ IDS verwendet werden.
- IDS
Wie ID, nur dass hier mehrere durch Leerzeichen getrennte IDs als Wert angegeben werden können.- IDREF
Referenz auf eine ID. Der Parser prüft, ob der Wert als ID an einer Stelle im Dokument definiert ist.- IDREFS
Wie IDREF, nur dass hier mehrere durch Leerzeichen getrennte ID-Referenzen als Wert angegeben werden können.- NUMBER
Stellt sicher, dass der Wert eine Zahl ist- NUMBERS
Wie NUMBER, nur dass hier mehrere durch Leerzeichen getrennte Zahlen angegeben werden können.- ENTITY
Dieser Typ gestattet die Angabe des Namens genau einer nicht-analysierten Entity.- ENTITIES
Wie ENTITY, nur dass hier die Namen mehrerer nicht-analysierter Entities angegeben werden können.- Eine Aufzählung. Die Aufzählung kann entweder aus benutzerdefinierten Werten bestehen (z.B. (YES¦NO)) oder aus einer Liste von Notations-Namen. In beiden Fällen werden die Aufzählungselemente durch eine Pipe (¦) getrennt.
- #IMPLIED
Das Attribut gilt als optional.- #REQUIRED
Das Attribut muss grundsätzlich explizit im Dokument angegeben werden. Wenn dieser Zusatz bei CDATA-Attributen benutzt wird, ist zu beachten, dass #REQUIRED nicht sicherstellt, dass das Attribut eine nicht leere Zeichenkette enthält. Ein als ATT="" explizit angegebenes CDATA-Attribut erfüllt die #REQUIRED-Klausel, ist aber möglicherweise im Sinne der Applikation nicht korrekt. Es gibt in XML keine Möglichkeit, zu erzwingen, dass für ein CDATA-Attribut eine nicht leere Zeichenkette angegeben werden muss.- Ein Vorgabewert.
- #FIXED
Kann in Verbindung mit einem Vorgabewert angegeben werden und schreibt diesen Wert als unveränderbar fest.
Im folgenden Beispiel wird ein Element mit einem CDATA-Attribut definiert, das als REQUIRED gekennzeichnet ist:<!ELEMENT DEMO EMPTY> <!ATTLIST DEMO NAME CDATA #REQUIRED>Die nachfolgenden Zeilen sind alle gültige Verwendungen dieses Elements. Zu beachten ist insbesondere die letzte Zeile, in der der Wert als leerer String angegeben wird,<DEMO NAME="test"> <DEMO NAME="ein sehr langer Wert"> <DEMO NAME="">Das nächste Beispiel definiert ein Attribut mit Aufzählungstyp und Standardwert. Das Attribut gehört zum Element LIST (das eine Aufzählung darstellen könnte) und heißt TYPE. Der Wert ist entweder ordered oder unordered, die Vorgabe ist unordered. Der Vorgabewert wird dann angenommen, wenn das Attribut nicht im Exemplar angegeben wird.<!ATTLIST LIST TYPE (ordered|unordered) "unordered">
Folgendes Beispiel zeigt die Verwendung der Typen ID und IDREF bei der Definition von Elementen zur Erstellung von Verweisen.<-- Verweisziel --> <!ELEMENT LABEL EMPTY> <!ATTLIST LABEL ID ID #REQUIRED> <-- Referenz auf die Verweisziele --> <!ELEMENT REF EMPTY> <!ATTLIST REF ID IDREF #REQUIRED>In beiden Fällen wird das Attribut ID genannt. Die Attributdefinition von LABEL zeigt, dass ein Attribut auch genauso benannt werden kann wie sein Typ, was aber normalerweise schlechter Stil ist. ID ist jedoch eine in der Praxis oft vorkommende Ausnahme von diesem Grundsatz.
Im Dokument würden diese Elemente folgendermaßen verwendet werden:Das <LABEL ID="MARKE.GNU">Gnu lebt in den Steppen Afrikas... ...an einer späteren Stelle im Dokument: Gnu: Huftier <REF ID="MARKE.GNU">, auch Name einer Organisation...Es ist zu beachten, dass der ID/IDREF-Mechanismus keinerlei Verweise in das Endprodukt einfügt. Er stellt lediglich sicher, dass es zu jeder referenzierten ID auch eine passende ID-Definition gibt. Das Einfügen von Verweisen in das Endprodukt muss in der Applikation implementiert werden, in einem HTML-Konverter z.B. durch Einfügen eines Links mit einem <A HREF="...">-Tag.
Ein Element kann natürlich auch mehrere Attribute haben. Die Typen sind hierbei beliebig. Meist schreibt man dabei jede Element-Definition in eine eigene Zeile, obwohl dies nicht unbedingt erforderlich ist:<!ELEMENT MULTI EMPTY> <!ATTLIST MULTI ATT1 CDATA #REQUIRED ATT2 (raw|cooked) cooked ID ID #IMPLIED>