Qualifizieren oder nicht – das ist hier die Frage

(Auszug aus "XML Schema" von Eric van der Vlist)

Die Schemas, die wir bisher geschrieben haben, hatten keine Zielnamensraum-Deklaration. Wir konnten außerdem nur Elemente und Attribute beschreiben, die zu keinem Namensraum gehörten.

Die Deklaration eines Ziel-Namensraums erlaubt es uns, solche Elemente und Attribute zu definieren, die zum Ziel-Namensraum gehören (diese werden »qualifiziert« genannt), und solche, die zu keinem Namensraum gehören (»unqualifiziert« genannt).

Der Zweck eines Schemas ist es, ein Vokabular zu beschreiben. Dessen auf der obersten Ebene liegende Knoten gehören zu seinem Ziel-Namensraum. Wenn ein Zielnamensraum deklariert wird, ist es daher verboten, globale Elemente zu definieren, die unqualifiziert sind.

Die Unterscheidung zwischen qualifizierten und unqualifizierten Elementen und Attributen wird durch ihr Attribut form getroffen. Beispiel:

<xs:element name="book" form="qualified"/>

<xs:attribute name="isbn" form="qualified"/>

<xs:attribute name="lang" form="unqualified"/>

<xs:element name="character" form="unqualified"/>

Die Standardwerte dieser form-Attribute werden durch die Attribute elementFormDefault und attributeFormDefault festgelegt, die wir unserem Element xs:schema hinzugefügt haben.

Diese beiden Attribute haben ihrerseits wieder Standardwerte, und zwar elementFormDefault="unqualified" sowie attributeFormDefault="unqualified". Diese Werte sind in dem Fall angemessen, daß nur das Dokumentenelement einen Namensraum verwendet:

<lib:library xmlns:lib="http://dyomedea.com/ns/library">
  <book id="b3810518883" available="yes">
     <isbn>
       3810518883
     </isbn>
     <title>
       Auf den Hund gekommen
     </title>
  </book>
</lib:library>

Da globale Elemente und Attribute qualifiziert sein müssen, erfordert die Definition dieses Schemas als einheitliches Ganzes, daß alle Elemente und Attribute lokal definiert werden.

Eine andere Kombination, elementFormDefault="qualified" und attributeFormDefault="unqualified", paßt zu dem weit verbreiteten Fall, daß ein Namensraum mit dem Wurzelelement verknüpft ist und dadurch zum Default-Namensraum wird, der definitionsgemäß für die darin liegenden Elemente gilt, nicht jedoch für die Attribute. (Laut Namensraum-Empfehlung gilt der Default-Namensraum nicht für Attribute.)

<library xmlns="http://dyomedea.com/ns/library">
    <book id="b3810518883" available="yes">
        <isbn>
            3810518883
        </isbn>
        <title>
            Auf den Hund gekommen
        </title>
    </book>
</library>

Der Gebrauch betrachtet unqualifizierte Attribute als zum selben Vokabular wie ihr Elternelement gehörig. Die Vokabulare, die qualifizierte Attribute einsetzen, sind oft solche, die Attribute zur Verfügung stellen, die in Elementen aus anderen Namensräumen verwendet werden. Beispiele für solche Vokabulare sind unter anderem RDF und reine Attribut-Vokabulare wie XLink und XML Base. Die Schemas für diese Vokabulare profitieren davon, wenn attributeFormDefault auf »qualifiziert« gesetzt wird.

Besondere Beachtung verdient der Sonderstatus der Attribute in der Namensraum-Spezifikation. Der Default-Namensraum gilt nicht für Attribute. Das bedeutet, daß ein Attribut ohne Präfix als namensraumlos angesehen wird.

Ein weiterer verwirrender Aspekt von Attributen mit Präfix (die demnach zu einem Namensraum gehören) liegt darin, daß solche Attribute in der Namensraum-Empfehlung »globale Attribute« genannt werden. In W3C XML Schema wird der Ausdruck »global« anders gebraucht, nämlich im Gegensatz zu lokalen Elementen oder Attributen. Ein globales Attribut in der Terminologie der Namensräume ist demnach ein qualifiziertes Attribut in der Sprechweise von W3C XML Schema, und es kann global oder lokal definiert sein.

Denken Sie daran, daß <elementFormDefault> und <attributeFormDefault> Standardwerte festlegen und daß Sie Element für Element und Attribut für Attribut angeben können, ob sie qualifiziert sind oder nicht.

Bevor wir uns ansehen, wie man weitere Namensräume ins Spiel bringen kann, betrachten wir ein einfaches Instanzdokument mit einem einzigen Namensraum und unqualifizierten Attributen:

<?xml version="1.0"?>
<library xmlns="http://dyomedea.com/ns/library">
    <book id="b3810518883" available="yes">
        <isbn>
            3810518883
        </isbn>
        <title>
            Auf den Hund gekommen
        </title>
        <authors>
            <person id="CMS">
                <name>
                    Charles M. Schulz
                </name>
                <born>
                    1922-11-26
                </born>
                <dead>
                    2000-02-12
                </dead>
            </person>
        </authors>
        <characters>
            <person id="PP">
                <name>
                    Peppermint Patty
                </name>
                <born>
                    1966-08-22
                </born>
                <qualification>
                    kühn, dreist und draufgängerisch
                </qualification>
            </person>
            <person id="Snoopy">
                <name>
                    Snoopy
                </name>
                <born>
                    1950-10-04
                </born>
                <qualification>
                    extrovertierter Beagle
                </qualification>
            </person>
            <person id="Schroeder">
                <name>
                    Schroeder
                </name>
                <born>
                    1951-05-30
                </born>
                <qualification>
                    brachte die klassische Musik in die Peanuts-Comics ein
                </qualification>
            </person>
            <person id="Lucy">
                <name>
                    Lucy
                </name>
                <born>
                    1952-03-03
                </born>
                <qualification>
                    herrschsüchtig, kratzbürstig und egoistisch
                </qualification>
            </person>
        </characters>
    </book>
</library>

Wenn wir Verwechslungen beim Schreiben eines Schemas für dieses Instanzdokument vermeiden wollen, können wir in dem Schema Präfixe sowohl für unseren Ziel-Namensraum als auch für den Namensraum von W3C XML Schema definieren, was zu einem Schema wie dem folgenden führt:

<?xml version="1.0"?>
<xs:schema targetNamespace="http://dyomedea.com/ns/library" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:lib="http://dyomedea.com/ns/library" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="library">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="book" type="lib:bookType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="person">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="born" type="xs:date"/>
                <xs:element name="dead" type="xs:date" minOccurs="0"/>
                <xs:element name="qualification" type="xs:string" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute name="id" type="xs:ID" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="bookType">
        <xs:sequence>
            <xs:element name="isbn" type="xs:NMTOKEN"/>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="authors">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="lib:person" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="characters">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="lib:person" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID" use="required"/>
        <xs:attribute name="available" type="xs:string" use="required"/>
    </xs:complexType>
</xs:schema>

In diesem Beispiel sind die Namen von Komponenten, die das Schema definiert, stets präfixlos, wenn sie definiert werden. Weil dieses Schema nur Komponenten in dem einen Namensraum "http://dyomedea.com/ns/library" (durch das Attribut targetNamespace des Elements xs:schema angegeben) definiert, gibt es keine Verwechslungsgefahr. Die einzigen anderen hier auftretenden Namensräume sind der Namensraum für W3C XML Schema selbst, der durch das Präfix xs identifiziert wird, und eine weitere Abbildung für den Namensraum "http://dyomedea.com/ns/library", der lib als Präfix verwendet. Die Form mit lib als Präfix wird für Querverweise zwischen den Deklarationen verwendet.

Ein streng äquivalentes Schema, das exakt dasselbe Datenmodell definiert, kann definiert werden, indem man den Ziel-Namensraum als Default-Namensraum des Schema-Dokuments verwendet:

<?xml version="1.0"?>
<xs:schema targetNamespace="http://dyomedea.com/ns/library" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://dyomedea.com/ns/library">
    <xs:element name="library">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="book" type="bookType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="person">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="born" type="xs:date"/>
                <xs:element name="dead" type="xs:date" minOccurs="0"/>
                <xs:element name="qualification" type="xs:string" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute name="id" type="xs:ID" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="bookType">
        <xs:sequence>
            <xs:element name="isbn" type="xs:NMTOKEN"/>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="authors">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="person" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="characters">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="person" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="id" type="xs:ID" use="required"/>
        <xs:attribute name="available" type="xs:string" use="required"/>
    </xs:complexType>
</xs:schema>

In dieser Fassung werden alle Verweise auf die W3C-XML-Schema-eigenen Elemente immer noch mit dem Präfix xs vorgenommen. Namen von Komponenten sind immer noch präfixlos, aber das Präfix lib ist nun unnötig, deswegen können alle diese Präfixe verschwinden. Da der Default-Namensraum in diesem Dokument definiert ist, versteht W3C XML Schema die Verbindung zwischen den dort definierten Komponenten und den Verweisen auf diese Komponenten.

Wenn Sie lieber Präfixe bei den Komponenten verwenden, die Sie definieren, und das Vokabular von W3C XML Schema ohne Präfixe verwenden, können Sie auch den Namensraum von W3C XML als Default-Namensraum festlegen und einen Namensraum mit Präfix (hier: lib) für die Komponenten verwenden, die Sie definieren:

<?xml version="1.0"?>
<schema targetNamespace="http://dyomedea.com/ns/library" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:lib="http://dyomedea.com/ns/library">
    <element name="library">
        <complexType>
            <sequence>
                <element name="book" type="lib:bookType"/>
            </sequence>
        </complexType>
    </element>
    <element name="person">
        <complexType>
            <sequence>
                <element name="name" type="string"/>
                <element name="born" type="date"/>
                <element name="dead" type="date" minOccurs="0"/>
                <element name="qualification" type="string" minOccurs="0"/>
            </sequence>
            <attribute name="id" type="ID" use="required"/>
        </complexType>
    </element>
    <complexType name="bookType">
        <sequence>
            <element name="isbn" type="NMTOKEN"/>
            <element name="title" type="string"/>
            <element name="authors">
                <complexType>
                    <sequence>
                        <element ref="lib:person" maxOccurs="unbounded"/>
                    </sequence>
                </complexType>
            </element>
            <element name="characters">
                <complexType>
                    <sequence>
                        <element ref="lib:person" maxOccurs="unbounded"/>
                    </sequence>
                </complexType>
            </element>
        </sequence>
        <attribute name="id" type="ID" use="required"/>
        <attribute name="available" type="string" use="required"/>
    </complexType>
</schema>

Die Verweise auf Datentypen von W3C XML Schema werden nun ohne Präfix vorgenommen, während Verweise auf Komponenten, die im Ziel-Namensraum definiert sind, mit Hilfe des Präfixes lib geschehen.

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XML Schema bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2003 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XML Schema" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de