Verweise auf andere Namensräume

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

Eines der Ziele der Namensraum-Spezifikation besteht darin, die Verwendung von Dokumenten zuzulassen, die Elemente und Attribute aus verschiedenen Vokabularen mischen. W3C XML Schema erlaubt es, diese Möglichkeit voll zu nutzen.

Ein Teil des Bibliotheksvokabulars beschreibt Personen. Dieser Teil könnte von anderen Anwendungen wiederverwendet werden. Daher möchten wir einen eigenen Namensraum definieren und geben ihm die URI-Referenz "http://dyomedea.com/ns/people":

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

Um diese beiden Namensräume in den Griff zu bekommen, müssen wir zwei getrennte Schemas (eines je Namensraum) definieren. Das eine wird unser Vokabular über Personen beschreiben und auch die Definitionen des Elements person und seiner Kindelemente enthalten:

<?xml version="1.0"?>
<xs:schema targetNamespace="http://dyomedea.com/ns/people" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:ppl="http://dyomedea.com/ns/people" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <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:schema>

Dieses Schema beschreibt den Namensraum "http://dyomedea.com/ns/people", und das Vokabular bindet nichts aus irgendeinem anderen Namensraum ein. Das Schema ist dann den Beispielen, die wir bisher in diesem Kapietl gesehen haben, ähnlich. Es kann selbständig mit Dokumenten benutzt werden, die nur diesen Namensraum verwenden, es kann jedoch auch von Schemas »importiert« werden, die andere Namensräume beschreiben, aber gern einige unserer Definitionen verwenden würden.

Um dies zu erreichen, braucht das Schema, das das einbindende Vokabular beschreibt, zweierlei Informationen. Es muß ein Präfix für die einzubindenden Namensräume haben; dies wird durch eine normale Namensraum-Deklaration erreicht. Es muß auch einen Hinweis darüber enthalten, wo es das Schema für diesen Namensraum finden kann; dies erreicht man, indem man das Element xs:import verwendet:

<xs:import namespace="http://dyomedea.com/ns/people" schemaLocation="simple-2-ns-ppl.xsd"/>

Das Schema verfügt nun über alle benötigten Informationen, die es zum Auflösen der Verweise auf Schema-Komponenten benötigt, die zum Namensraum "http://dyomedea.com/ns/people" gehören. Verweise können einfach das Präfix dieses Namensraums verwenden:

<xs:element ref="ppl:person"/>

Ein vollständiges Schema für das Bibliotheksvokabular kann dann so aussehen:

<?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:ppl="http://dyomedea.com/ns/people" xmlns:lib="http://dyomedea.com/ns/library">
    <xs:import namespace="http://dyomedea.com/ns/people" schemaLocation="simple-2-ns-ppl.xsd"/>
    <xs:element name="library">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="book" type="lib:bookType"/>
            </xs:sequence>
        </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="ppl:person"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="characters">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="ppl: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>

Beim Import von Schemas aus anderen Namensräumen können wir nur auf globale Komponenten verweisen, die in den importierten Schemas definiert sind.

   

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