Zurück zu unserer Bibliothek

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

Nun wollen wir sehen, wo wir unser Schweizer Offiziersmesser in unserer Bibliothek verwenden können. Der erste Datentyp, für den wir am Ende des vorigen Kapitels eine Verbesserung versprochen hatten, ist die ISBN. Ohne an den Einzelheiten des Aufbaus einer ISBN (die mit Hilfe von W3C XML Schema nicht vollständig überprüft werden können) herumzubasteln, können wir sicherstellen, daß insgesamt genau zehn Zeichen vorliegen und daß nur Ziffern und der Buchstabe »X« auftreten:

<xs:simpleType name="isbn">
   <xs:restriction base="xs:NMTOKEN">
      <xs:length value="10"/>
      <xs:pattern value="[0-9]{9}[0-9X]"/>
   </xs:restriction>
</xs:simpleType>

Sie fragen sich vielleicht, warum wir xs:length beibehalten haben, da diese Angabe für Zwecke der Validierung weniger stark als das hinzugefügte xs:pattern einschränkt. Das ist eine berechtigte Frage, auf die es jedoch noch keine vollständige Antwort gibt. Anwendungen, die das PSVI als Quelle von Metainformationen verwenden, können an einem Muster vielleicht erkennen, daß die Länge eines Strings beschränkt ist, vielleicht jedoch auch nicht. Es könnte sich als sinnvolle Praxis erweisen, redundante Facetten beizubehalten, um solchen zukünftigen Anwendungen zusätzliche Informationen zur Verfügung zu stellen.

W3C XML Schema kann die Tatsache nicht ausdrücken, daß die Buch-ID derselbe Wert wie die ISBN mit einem vorangestellten »b« ist. Wir können aber zumindest definieren, daß es sich um ein »b« mit neun Ziffern und einer weiteren Ziffer oder aber einem »X« am Ende handelt:

<xs:simpleType name="bookID">
  <xs:restriction base="xs:ID">
    <xs:pattern value="b[0-9]{9}[0-9X]"/>
  </xs:restriction>
</xs:simpleType>

Um diesen neuen Datentyp zu verwenden, müssen wir uns darüber im klaren sein, daß wir ein globales Attribut verwenden, auf das in dem Element book Bezug genommen wird, das jedoch auch in den Elementen character und author verwendet wird, die nicht dasselbe Format haben. Das ist die wichtigste Beschränkung bei der Verwendung globaler Elemente und Attribute: Sie können nur referenziert werden, wenn sie an allen Stellen, an denen sie auftreten, denselben Typ haben. Wir können dieses Problem umgehen, indem wir eine lokale Attributdefinition für das book -Attribut id mit dem neuen Datentyp erzeugen.

Das letzte, was wir noch einschränken wollen, sind die Datumsangaben, für die keine Zeitzonen benötigt werden. Zeitzonenangaben könnten sich tatsächlich sogar als Quelle von Problemen erweisen, wenn wir sie vergleichen wollen.

<xs:simpleType name="date">
  <xs:restriction base="xs:date">
     <xs:pattern value="[^:Z]*"/>
  </xs:restriction>
</xs:simpleType>

Unser neues Schema lautet nun:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="string255">
        <xs:restriction base="xs:token">
            <xs:maxLength value="255"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="string32">
        <xs:restriction base="xs:token">
            <xs:maxLength value="32"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="isbn">
        <xs:restriction base="xs:NMTOKEN">
            <xs:length value="10"/>
            <xs:pattern value="[0-9]{9}[0-9X]"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="bookID">
        <xs:restriction base="xs:ID">
            <xs:pattern value="b[0-9]{9}[0-9X]"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="supportedLanguages">
        <xs:restriction base="xs:language">
            <xs:enumeration value="en"/>
            <xs:enumeration value="de"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="date">
        <xs:restriction base="xs:date">
            <xs:pattern value="[^:Z]*"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="name" type="string32"/>
    <xs:element name="qualification" type="string255"/>
    <xs:element name="born" type="date"/>
    <xs:element name="dead" type="date"/>
    <xs:element name="isbn" type="isbn"/>
    <xs:attribute name="id" type="xs:ID"/>
    <xs:attribute name="available" type="xs:boolean"/>
    <xs:attribute name="lang" type="supportedLanguages"/>
    <xs:element name="title">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="string255">
                    <xs:attribute ref="lang"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
    <xs:element name="library">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="book" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="author">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="name"/>
                <xs:element ref="born"/>
                <xs:element ref="dead" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute ref="id"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="book">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="isbn"/>
                <xs:element ref="title"/>
                <xs:element ref="author" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="character" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="id" type="bookID"/>
            <xs:attribute ref="available"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="character">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="name"/>
                <xs:element ref="born"/>
                <xs:element ref="qualification"/>
            </xs:sequence>
            <xs:attribute ref="id"/>
        </xs:complexType>
    </xs:element>
</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