Schemas für XML, XML Base und XLink

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

XML Base, XLink und XML 1.0 definieren jeweils Vokabulare, die nur aus Attributen zusammengesetzt sind. Attribute wie xml:base, xlink:href oder xml:lang sind dafür entworfen worden, mit Elementen beliebiger Vokabulare zusammenzuarbeiten und dabei ihre Bedeutung an diese Elemente, manchmal auch an deren Nachkommen, weiterzugeben.

XML-Attribute

In diesem Abschnitt werden wir erörtern, wie wir die Nutzung eines XML-Attributs in unserem Dokument gestatten können. Um dies zu veranschaulichen, verwenden wir ein Attribut xml:lang, um bei unserem Buch mehrere Beschreibungen in verschiedenen Sprachen zuzulassen und jeweils die Sprache ausdrücklich anzugeben:

<?xml version="1.0"?>
<library xmlns="http://dyomedea.com/ns/library">
    <book id="b3810518883">
        <title>
            Auf den Hund gekommen
        </title>
        <description xml:lang="en">
            Its title says it all !
        </description>
        <description xml:lang="de">
            Der Titel sagt alles!!
        </description>
    </book>
</library>

In Übereinstimmung mit der Empfehlung »Namensräume in XML 1.0« betrachtet W3C XML Schema xml:lang, xml:space (aus der XML 1.0-Empfehlung) und xml:base (aus der XML Base-Spezifikation) als zum Namensraum von XML 1.0 gehörig, der durch den URI-Verweis "http://dyomedea.com/ns/library" identifiziert wird.

Der Namensraum XML 1.0 ist in der Welt der Namensräume eine Ausnahme, da wir ihn in den Instanzdokumenten nicht deklarieren müssen. Sein Präfix »xml« ist für diese Verwendung reserviert und hat eine besondere Bedeutung, selbst für Parser, die keine Namensräume unterstützen. Theoretisch kann dem Namensraum XML 1.0 auch jedes andere Präfix zugewiesen werden, aber dieses Vorgehen wäre verwirrend und sollte nicht befürwortet werden.

Um Attribute aus diesem Namensraum zu verwenden, deklarieren wir den XML-Namensraum, importieren ein Schema und referenzieren beide, wie wir es oben bereits mit den Elementen aus unserem Namensraum »people« getan haben:

<?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:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
    <xs:element name="description">
        <xs:complexType>
            <xs:simpleContent>
                <xs:restriction base="xs:string">
                    <xs:attribute ref="xml:lang"/>
                </xs:restriction>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
    <xs:element name="library">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="lib:book"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="book">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="title" type="xs:string"/>
                <xs:element ref="lib:description" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="id" type="xs:ID" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

In diesem Beispiel importieren wir ein lokales Schema (xml.xsd) für den XML- Namensraum. Das W3C hat ein eigenes Schema für die Attribute xml:lang, xml:space und xml:base definiert.

<?xml version='1.0'?>
<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd">
<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">
    <xs:annotation>
        <xs:documentation>See http://www.w3.org/XML/1998/namespace.html and http://www.w3.org/TR/REC-xml for information about this namespace.</xs:documentation>
    </xs:annotation>
    <xs:annotation>
        <xs:documentation>This schema defines attributes and an attribute group
            suitable for use by
            schemas wishing to allow xml:base, xml:lang or xml:space attributes
            on elements they define.
            To enable this, such a schema must import this schema
            for the XML namespace, e.g. as follows:
            &lt;schema . . .>
            . . .
            &lt;import namespace="http://www.w3.org/XML/1998/namespace"
            schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
            Subsequently, qualified reference to any of the attributes
            or the group defined below will have the desired effect, e.g.
            &lt;type . . .>
            . . .
            &lt;attributeGroup ref="xml:specialAttrs"/>
            will define a type which will schema-validate an instance
            element with any of those attributes</xs:documentation>
    </xs:annotation>
    <xs:annotation>
        <xs:documentation>In keeping with the XML Schema WG's standard versioning
            policy, this schema document will persist at
            http://www.w3.org/2001/03/xml.xsd.
            At the date of issue it can also be found at
            http://www.w3.org/2001/xml.xsd.
            The schema document at that URI may however change in the future,
            in order to remain compatible with the latest version of XML Schema
            itself. In other words, if the XML Schema namespace changes, the version
            of this document at
            http://www.w3.org/2001/xml.xsd will change
            accordingly; the version at
            http://www.w3.org/2001/03/xml.xsd will not change.
        </xs:documentation>
    </xs:annotation>
    <xs:attribute name="lang" type="xs:language">
        <xs:annotation>
            <xs:documentation>In due course, we should install the relevant ISO 2- and 3-letter codes as the enumerated possible values . . .</xs:documentation>
        </xs:annotation>
    </xs:attribute>
    <xs:attribute name="space" default="preserve">
        <xs:simpleType>
            <xs:restriction base="xs:NCName">
                <xs:enumeration value="default"/>
                <xs:enumeration value="preserve"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="base" type="xs:anyURI">
        <xs:annotation>
            <xs:documentation>See http://www.w3.org/TR/xmlbase/ for information about this attribute.</xs:documentation>
        </xs:annotation>
    </xs:attribute>
    <xs:attributeGroup name="specialAttrs">
        <xs:attribute ref="xml:base"/>
        <xs:attribute ref="xml:lang"/>
        <xs:attribute ref="xml:space"/>
    </xs:attributeGroup>
</xs:schema> 

Unter den vielen kontroversen Problemen im Umfeld der Verwendung von URIs findet sich auch die nicht leicht zu treffende Entscheidung, ob man ein Schema an seinem Ursprungsort (auf der W3C-Website) oder aber eine lokale Kopie verwendet. Ein Schema an seinem Ursprungsort zu verwenden garantiert, daß man immer auf die aktuellste Version zugreift, aber genau dies kann Schwierigkeiten bereiten, wenn das Schema und die Anwendungen, die es verwenden, nicht mehr im Gleichtakt sind. Es kann auch Folgen für die Verarbeitbarkeit von Dokumenten haben, wenn der Webhost nicht erreichbar ist, und eröffnet vielleicht die Möglichkeit bösartiger Unterschiebungen von Schemas.

XLink-Attribute

Um die Verwendung von XLink-Attributen zu veranschaulichen, können wir die Definition des Autors, die derzeit innerhalb der Beschreibung eines Buchs unterhalb des Elements authors steht, mit einem Verweis auf einen als »person« beschriebenen Autor in einem anderen XML-Dokument ersetzen:

<?xml version="1.0"?>
<library xmlns="http://dyomedea.com/ns/library" xmlns:xlink="http://www.w3.org/1999/xlink">
    <book id="b3810518883">
        <title>
            Auf den Hund gekommen
        </title>
        <authors>
            <person xlink:href="authors.xml#CMS"/>
        </authors>
    </book>
</library>   

Auch hier müssen wir den Namensraum für XLink definieren und ein Schema importieren, bevor wir die XLink-Attribute verwenden:

<?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:xlink="http://www.w3.org/1999/xlink" xmlns:lib="http://dyomedea.com/ns/library">
    <xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlink.xsd"/>
    <xs:element name="person">
        <xs:complexType>
            <xs:attribute ref="xlink:href" use="required"/>
            <xs:attribute ref="xlink:type" fixed="simple"/>
            <xs:attribute ref="xlink:show" fixed="embed"/>
            <xs:attribute ref="xlink:actuate" fixed="onLoad"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="library">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="lib:book"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="book">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="title" type="xs:string"/>
                <xs:element ref="lib:authors"/>
            </xs:sequence>
            <xs:attribute name="id" type="xs:ID" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="authors">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="lib:person"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Wir befolgen die Empfehlung der XLink-Spezifikation und legen zusätzliche XLink-Attribute (type, show und actuate) als fixe Werte fest. Auch wenn dies zulässig ist, sollte man daran denken, daß diese Werte nur Anwendungen zugänglich sind, die ein Post-Schema-Validation-Infoset (PSVI) im Sinne von W3C XML Schema nutzen.

Obwohl die XLink-Spezifikation kein Schema zur Verfügung stellt, ist es ganz einfach, die benötigten Teile zu erzeugen:

<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.w3.org/1999/xlink" elementFormDefault="qualified" attributeFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink">
    <xs:attribute name="type">
        <xs:simpleType>
            <xs:restriction base="xs:NMTOKEN">
                <xs:enumeration value="simple"/>
                <xs:enumeration value="extended"/>
                <xs:enumeration value="locator"/>
                <xs:enumeration value="arc"/>
                <xs:enumeration value="resource"/>
                <xs:enumeration value="title"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="href" type="xs:anyURI"/>
    <xs:attribute name="role" type="xs:anyURI"/>
    <xs:attribute name="arcrole" type="xs:anyURI"/>
    <xs:attribute name="title" type="xs:string"/>
    <xs:attribute name="show">
        <xs:simpleType>
            <xs:restriction base="xs:NMTOKEN">
                <xs:enumeration value="new"/>
                <xs:enumeration value="replace"/>
                <xs:enumeration value="embed"/>
                <xs:enumeration value="other"/>
                <xs:enumeration value="none"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="label" type="xs:NMTOKEN"/>
    <xs:attribute name="actuate">
        <xs:simpleType>
            <xs:restriction base="xs:NMTOKEN">
                <xs:enumeration value="onLoad"/>
                <xs:enumeration value="onRequest"/>
                <xs:enumeration value="other"/>
                <xs:enumeration value="none"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="from" type="xs:NMTOKEN"/>
    <xs:attribute name="to" type="xs:NMTOKEN"/>
</xs:schema>

   

<< 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