Sql-und-Xml - Home

Xml lernen

Attribute definieren

  • Sämtliche für ein Element zulässigen Attribute können gemeinsam definiert werden durch:
    <!ATTLIST ELEMENTNAME ATTRIBUTE-DECLARATION-LIST>
    Diese Attributliste kann direkt auf die Definition des Elements folgen, sie kann auch später festgelegt werden. Ferner können zu einem Element mehrere dieser Attributlisten definiert werden, dann gilt die Vereinigung der Attribute als definiert. Schließlich kann zu einem Element ein Attribut mehrfach und verschiedenartig definiert werden. Dann ist die erste Definition gültig, die später folgenden Definitionen werden verworfen.
  • Die Attribute-Declaration-List enthält eine oder mehrere Attributdefinitionen:
    	QNAME TYPE DEFAULT
    Ein QNAME ist ein Name, der die Xml-typischen Bedingungen an Namen erfüllen muß. Es handelt sich auch hier, wie bei Elementen, um einen qualified Name, der entweder keinen Doppelpunkt enthält oder aus einem namespace-prefix und einen local part mit dem Doppelpunkt als Trennzeichen zusammengefügt wird.
  • Attributtypen können entweder Text (= CDATA), Token-Typen oder Aufzählungstypen sein. Beim Typ CDATA sind alle Textzeichen einschließlich globaler Entities erlaubt. Der Ersetzungstext der Entities darf jedoch keine Elemente, also keine < und > enthalten. Die Entities für diese Spitzklammern können verwendet werden.
  • Erlaubte Token-Typen sind:
    	ID		Attributwert gilt als eindeutige ID
    	IDREF		Attributwert muss gleich einer ID sein
    	IDREFS		dito für ein oder mehrere ID's
    	ENTITY		Attributwert muss gleich ungeparster Entity sein
    	ENTITIES	dito für ein oder mehrere Entities
    	NMTOKEN		Attributwert muss gleich einem Namen sein
    	NMTOKENS	dito für ein oder mehrere Namen
  • Wird ein Attribut vom Typ ID definiert, so muß der dem Attribut zugewiesene Wert eindeutig für dieses Attribut im aktuellen Dokument sein. Erlaubt sind übliche Namen, sie dürfen nicht mit einer Zahl beginnen. Ausdrücke wie 'i-1', 'i-2' sind folglich zulässig, so daß ID's aus Datenbanken verwendet werden können. Ein Element darf höchstens ein Attribut vom Typ ID haben, das Attribut muß vom Typ #IMPLIED oder #REQUIRED sein.
  • Wurde ein ID-Attribut definiert, können anschließend Attribute vom Typ IDREF/IDREFS gefordert werden, für die bei der Verwendung im Dokument als Wert nur einer der im Dokument auffindbaren ID's zulässig ist. IDREF erhält nur eine ID als Wert, bei IDREFS können mehrere ID's, durch Leerzeichen getrennt, angegeben werden.
  • Für ENTITY muß der Name einer externen, ungeparsten Entity mit einem NDATA-Abschnitt gewählt werden, siehe hierzu ein Beispiel unter ENTITIES.
  • Bei NMTOKEN wird gefordert, daß der Attributwert den Regeln für Xml-Namenszeichen entspricht. Damit sind Zahlen zu Beginn erlaubt, mehrere, durch Leerzeichen getrennte Ausdrücke jedoch ausgeschlossen. Bei NMTOKENS können Leerzeichen verwendet werden, diese trennen mehrere NMTOKEN-Ausdrücke.
  • Bei Aufzählungstypen wird die Liste der erlaubten Werte der Reihe nach angegeben und durch | getrennt.
  • ATTRIBUTE-DEFAULT: Für ein Attribut kann entweder in Hochkommata ein Wert festgelegt oder das Attribut vom Typ #IMPLIED (= optional), #REQUIRED oder #FIXED näher spezifiziert werden. Bei #IMPLIED kann auf das Attribut im Xml-Dokument verzichtet werden, #REQUIRED erfordert das Attribut in jedem Element. #FIXED bedeutet, daß nur ein einziger Wert zulässig ist, dieser muß anschließend angegeben werden. Ein spezifizierter Wert und #IMPLIED überschneiden sich, da ein so qualifiziertes Attribut im Element fehlen kann. Der Unterschied liegt darin, daß bei einem Default-Wert das Attribut dennoch vorhanden ist und es mit seinem Default-Wert verarbeitet wird, wohingegen es bei #IMPLIED tatsächlich fehlt.

Beispiele für Attribut-Definitionen

  • <!ATTLIST img
    	src CDATA #REQUIRED
    	name CDATA #IMPLIED
    >
    Dies ist der einfachste Fall: Für das Element img werden zwei Attribute definiert - src und name. Das erste Attribut ist notwendig, das zweite ist optional.
  • Beispiel für die Verwendung eines Standardwertes: Die Datei xml-attribute-default-sample.xml beinhaltet die folgende DTD:
    <?xml version='1.0'?>
    
    <!DOCTYPE attribute-defaults [
    
    <!ELEMENT attribute-defaults (myImage+)>
    
    <!ELEMENT myImage EMPTY>
    <!ATTLIST myImage
    	src CDATA "my-picture.gif"
    	name CDATA #IMPLIED >
    
    ]>
    
    <!-- Beginn des Dokumentes -->
    
    <attribute-defaults>
    
    	<myImage/>
    	<myImage src='coffee-beans.gif'
    		name='i-like-coffee'/>
    
    </attribute-defaults>
    
    
    Sie definiert ein Wurzelelement, das ein oder mehrere 'myImage' - Elemente enthält. Dieses ist ein Element ohne Content mit zwei Attributen, das erste Attribut ist mit einem Default-Wert, das zweite als #IMPLIED festgelegt. Im Xml-Dokument wird das Element zweimal verwendet, beim ersten Mal ohne Attribute, beim zweiten Mal sind beide Attribute gesetzt, der Standardwert ist hier überschrieben.
    Rufen Sie die obige Xml-Datei direkt auf. Als Ergebnis wird beim ersten Element das Attribut mit Standardwert ausgegeben, dies erledigt der Parser im Hintergrund. Beim zweiten myImage kann dieser Wert dennoch überschrieben werden. Das als #IMPLIED deklarierte Attribut 'name' ist nur dann vorhanden, falls es tatsächlich im Element angegeben wurde.

    Wird das Attribut so mit einem Standardwert definiert und fehlt es im Element, dann gilt der Standardwert als gesetzt. Damit können Informationen, die in den meisten, jedoch nicht in allen Fällen, einen Standardwert haben, auf einfache Weise in der DTD festgelegt werden, ohne daß das Attribut bei jedem Element notiert werden muß.
  • Beispiel für ID / IDREF - id-idref-sample.xml:
    <?xml version='1.0'?>
    
    <!DOCTYPE id-sample [
    
    <!ELEMENT id-sample (houses, rooms)>
    
    <!ELEMENT houses (house*)>
    <!ELEMENT rooms (room*)>
    
    <!ELEMENT house (#PCDATA)>
    <!ELEMENT room (#PCDATA)>
    
    <!ATTLIST house
    	house-id ID #REQUIRED
    	house-owner CDATA #IMPLIED>
    
    <!ATTLIST room
    	room-id ID #REQUIRED
    	house-id IDREF #REQUIRED>
    
    ]>
    
    <id-sample>
    
        <houses>
    
            <house house-id='h-1'/>
            <house house-id='h-2'/>
    
        </houses>
    
        <rooms>
    
            <room room-id='r-1' house-id='h-1'/>
            <room room-id='r-2' house-id='h-1'/>
            <room room-id='r-3' house-id='h-2'/>
    
        </rooms>
    
    </id-sample>
    Dieses Beispiel bildet Daten ab, die aus einer relationalen Datenbank stammen könnten. Zwei Tabellen - houses und rooms - mit Zeilen house sowie room. Die Spalten einer Tabelle werden nicht als Attribute des übergeordneten 'Tabellenelementes', sondern als Attribute der Zeilenelemente dargestellt. Primärschlüssel-Spalten können auf ID-Attribute abgebildet werden, Fremdschlüssel-Spalten werden als IDREF-Attribute codiert. Da es sich bei ID-Werten um korrekte Namen handeln muß, beginnen diese mit einem Buchstaben. Im Gegensatz zu Fremdschlüssel-Einschränkungen kann allerdings bei IDREF nur gefordert werden, daß es sich um eine ID handeln muß, der Elementtyp, von dem diese ID stammen muß, läßt sich nicht mehr festlegen. In der letzten Zeile wäre deshalb auch ein Selbstbezug in der folgenden Form möglich:
    <room room-id='r-3' house-id='r-3'/>
    Kopieren Sie sich dieses Beispiel in den Online-Xml-Trainer und ersetzen Sie bsp. 'r-3' durch 'r-2' oder 'h-2' durch 'h-3'. Dann erhalten Sie die entsprechenden Fehlermeldungen bezüglich ID oder IDREF.
  • Aufzählungen / Enumerationen - attribute-enumeration-sample.xml:
    <?xml version='1.0'?>
    
    <!DOCTYPE meetings [
    
    	<!ELEMENT meetings (meeting*)>
    
    	<!ELEMENT meeting EMPTY>
    	<!ATTLIST meeting
    		title CDATA #REQUIRED
    		day-of-week (Mo | 1Di | Mi | Do | Fr) #REQUIRED
    	>
    
    ]>
    
    <meetings>
    
    	<meeting title='Wochenanfangs-Konferenz'
    		day-of-week='Mo'/>
    
    	<meeting title='Abteilungsleiter-Sitzung'
    		day-of-week='Do'/>
    
    </meetings>
    Die als Attributwert erlaubten Ausdrücke werden geklammert und mit '|' getrennt. Hier sind alle gültigen NMTOKEN erlaubt, also zusammenhängende Zeichenfolgen, welche auch mit Ziffern beginnen dürfen.

© 2003-2016 Jürgen Auer, Berlin.