Zurück zu unserer Bibliothek

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

Wir haben in dieses Kapitel so viel Material hineingesteckt, daß es nicht offensichtlich ist, welche Möglichkeiten die nützlichsten sind. Die Wahl hängt zudem von äußeren Faktoren ab, zum Beispiel davon, wie weitgehend die benutzten Tools W3C XML Schema unterstützen. Einige Werkzeuge, die Java-Klassen oder -Bindungen erzeugen, können möglicherweise die Ableitung komplexer Typen durch Einschränkung nutzbringend verwerten. Diesem Pfad werden wir fürs erste folgen. Wir werden einen komplexen Typ komplexen Inhalts erzeugen, der die Obermenge der Inhaltsmodelle von author und character sein wird, die wir durch Einschränkung ableiten werden. Zuerst können wir noch ein leeres Inhaltsmodell mit einem Attribut id definieren, von dem wir durch Erweiterung alle Inhaltsmodelle ableiten können, die ebenfalls dieses Attribut haben.

<xs:complexType name="elementWithID">
  <xs:attribute ref="id"/>
</xs:complexType>

Diesen Typ können wir jedoch nicht direkt verwenden, um das Element book zu definieren, weil dessen Attribut id eine Einschränkung von xs:ID ist.

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

Um den komplexen Typ elementWithID für die Definition des Elements book zu verwenden, müssen wir durch Erweiterung einen komplexen Typ ableiten, der dem komplexen Typ von book entspricht, jedoch ohne die Einschränkung für das Attribut id. Der folgende Code ist ziemlich geschwätzig, wird hier aber zu Übungszwecken gezeigt:

<xs:complexType name="bookTmp">
   <xs:complexContent>
      <xs:extension base="elementWithID">
         <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 ref="available"/>
      </xs:extension>
   </xs:complexContent>
</xs:complexType>


<xs:element name="book">
   <xs:complexType>
      <xs:complexContent>
         <xs:restriction base="bookTmp">
            <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:restriction>
      </xs:complexContent>
   </xs:complexType>
</xs:element>

Eine kompaktere Variante besteht darin, zunächst durch Einschränkung abzuleiten:

<xs:complexType name="elementWithBookID">
   <xs:complexContent>
      <xs:restriction base="elementWithID">
         <xs:attribute name="id" type="bookID"/>
      </xs:restriction>
   </xs:complexContent>
</xs:complexType>

<xs:complexType name="book">
   <xs:complexContent>
      <xs:extension base="elementWithBookID">
         <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 ref="available"/>
      </xs:extension>
   </xs:complexContent>
</xs:complexType>

Es ist einfach, wenngleich nicht sehr kompakt, aus elementWithID durch Erweiterung einen Typ personType abzuleiten, der dann verwendet werden kann, um die Elemente author und character durch Einschränkung abzuleiten. Wir haben dieses Beispiel bereits gesehen. Das vollständige Schema sieht dann so aus:

<?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:complexType name="elementWithID">
      <xs:attribute ref="id"/>
   </xs:complexType>
   <xs:complexType name="bookTmp">
      <xs:complexContent>
         <xs:extension base="elementWithID">
            <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 ref="available"/>
         </xs:extension>
      </xs:complexContent>
   </xs:complexType>
   <xs:complexType name="personType">
      <xs:complexContent>
         <xs:extension base="elementWithID">
            <xs:sequence>
               <xs:element ref="name"/>
               <xs:element ref="born"/>
               <xs:element ref="dead" minOccurs="0"/>
               <xs:element ref="qualification" minOccurs="0"/>
            </xs:sequence>
         </xs:extension>
      </xs:complexContent>
   </xs:complexType>
   <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="book">
      <xs:complexType>
         <xs:complexContent>
            <xs:restriction base="bookTmp">
               <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:restriction>
         </xs:complexContent>
      </xs:complexType>
   </xs:element>
   <xs:element name="author">
      <xs:complexType>
         <xs:complexContent>
            <xs:restriction base="personType">
               <xs:sequence>
                  <xs:element ref="name"/>
                  <xs:element ref="born"/>
                  <xs:element ref="dead" minOccurs="0"/>
               </xs:sequence>
               <xs:attribute ref="id"/>
            </xs:restriction>
         </xs:complexContent>
      </xs:complexType>
   </xs:element>
   <xs:element name="character">
      <xs:complexType>
         <xs:complexContent>
            <xs:restriction base="personType">
               <xs:sequence>
                  <xs:element ref="name"/>
                  <xs:element ref="born"/>
                  <xs:element ref="qualification"/>
               </xs:sequence>
               <xs:attribute ref="id"/>
            </xs:restriction>
         </xs:complexContent>
      </xs:complexType>
   </xs:element>
</xs:schema

Ableitung oder Gruppen

Da die Ableitungsmethoden für komplexe Typen den Bereich der Strukturen, die sich mit W3C XML Schema definieren lassen, nicht erweitern und außerdem ziemlich kompliziert sind, ist ihre Verwendung strittig.

   

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