Von der Struktur des Instanzdokuments ausgehen

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

Für dieses zweite Schema werden wir einem Stil folgen, der dem in Das erstes Schema verwendeten genau entgegengesetzt ist, und alle Elemente und Attribute lokal dort definieren, wo sie im Dokument auftreten.

Wir folgen der Dokumentstruktur und beginnen mit der Definition des Dokumentelements library. Im vorigen Schema sah die Definition so aus:

<xs:element name="library">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="book" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

In unserem neuen Schema werden wir diese Konstruktion und die Struktur beibehalten, werden jedoch den Verweis auf das Element book durch die eigentliche Definition dieses Elements ersetzen:

<xs:element name="library">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="book" maxOccurs="unbounded">
        <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 ref="id"/>
          <xs:attribute ref="available"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Da die Definition des Elements book in der Definition des Elements library enthalten ist, könnten weitere Definitionen von Elementen namens book an anderen Stellen des Schemas erfolgen, ohne die geringste Verwirrung zu erzeugen – außer vielleicht für menschliche Leser.

Wenn alle Elemente und Attribute, auf die in diesem Schema sonst noch verwiesen wird, global definiert sind, ist dieses Schema-Stück gültig und beschreibt unser Schema exakt. Die einzigen Unterschiede zwischen dem ersten Schema und diesem Zwischenschritt liegen darin, daß das Element book nicht an anderer Stelle weiterverwendet werden kann und daß dieses Element nicht mehr als Dokumentelement auftreten darf.

Wir können denselben Vorgang wiederholt durchführen und die Definition aller Elemente und aller Attribute lokal vornehmen:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name="library">
      <xs:complexType>
         <xs:sequence>
            <xs:element name="book" maxOccurs="unbounded">
               <xs:complexType>
                  <xs:sequence>
                     <xs:element name="isbn" type="xs:integer"/>
                     <xs:element name="title">
                        <xs:complexType>
                           <xs:simpleContent>
                              <xs:extension base="xs:string">
                                 <xs:attribute name="lang" type="xs:language"/>
                              </xs:extension>
                           </xs:simpleContent>
                        </xs:complexType>
                     </xs:element>
                     <xs:element name="author" minOccurs="0" maxOccurs="unbounded">
                        <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"/>
                           </xs:sequence>
                           <xs:attribute name="id" type="xs:ID"/>
                        </xs:complexType>
                     </xs:element>
                     <xs:element name="character" minOccurs="0" maxOccurs="unbounded">
                        <xs:complexType>
                           <xs:sequence>
                              <xs:element name="name" type="xs:string"/>
                              <xs:element name="born" type="xs:date"/>
                              <xs:element name="qualification" type="xs:string"/>
                           </xs:sequence>
                           <xs:attribute name="id" type="xs:ID"/>
                        </xs:complexType>
                     </xs:element>
                  </xs:sequence>
                  <xs:attribute name="id" type="xs:ID"/>
                  <xs:attribute name="available" type="xs:boolean"/>
               </xs:complexType>
            </xs:element>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
</xs:schema>

Läßt man einmal den offensichtlichen Unterschied im Stil beiseite, validiert dieses neue Schema dasselbe Instanzdokument wie in Das Instanzdokument. Es ist jedoch strenggenommen nicht äquivalent mit dem ersten Schema: Es ist schlechter wiederverwendbar (das Dokumentelement ist das einzige, das in einem anderen Schema weiterverwendet werden könnte) und außerdem strenger, denn es validiert nur diejenigen Dokumente, die library als Dokumentelement haben. Das erste Schema muß jedoch Dokumente validieren, die irgendeines der Elemente als Dokumentelement haben.

Der Preis, den wir bei W3C XML Schema dafür bezahlen, daß wir den Wert für das Wurzelelement des Dokuments beschränken, besteht in einem Verlust an Wiederverwendbarkeit. Dies ist weithin kritisiert worden, ohne jedoch die Entscheidung der Herausgeber zu beeinflussen. Wir werden jedoch sehen, daß es glücklicherweise einige Tricks gibt, mit denen sich dieser Verlust für Anwendungen, die den Wert des Dokument elements beschränken müssen, begrenzen läßt.

   

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