Einfache Inhaltsmodelle

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

Wir beginnen mit einem Blick auf komplexe Typen, die einfachen Inhalt enthalten, weil sie den einfachen Typen, die wir bisher kennen, am nächsten stehen und weil sie einen leichteren Übergang in die kompliziertere Welt der komplexen Inhalte ermöglichen. Wir werden Erzeugung und Ableitung einfacher Typen, die bereits unter Erzeugung einfacher Datentypen abgedeckt wurden, hier nicht erörtern, sondern uns auf die Inhaltsmodelle komplexer Typen (also von Elementen, die nur Attribute und Textknoten haben) konzentrieren und untersuchen, wie sie erzeugt und abgeleitet werden.

Erzeugung einfacher Inhaltsmodelle

Komplexe Typen mit einfachen Inhaltsmodellen werden erzeugt, indem man einem einfachen Typ eine Reihe von Attributen hinzufügt. Den Vorgang, einem einfachen Typ Attribute hinzuzufügen, um einen komplexen Typ mit einfachem Inhalt zu erzeugen, nennt man Erweiterung des einfachen Typs. Die Schreibweise ist leicht verständlich; Beispiele für eine solche Erzeugungsart haben wir bereits unter Die Verwendung vordefinierter einfacher Datentypen gesehen:

<xs:element name="title">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="string255">
        <xs:attribute ref="lang"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

Das einzige, was hier geändert werden muß, ist, daß die Definition des einfachen Typs nicht direkt in xs:extension (komplexer Inhalt) eingebettet werden kann und daß statt dessen mit Hilfe des Attributs base auf sie verwiesen werden muß.

Die selbe Schreibweise mit derselben Bedeutung kann verwendet werden, um globale komplexe Typen zu erzeugen, die verwendet werden können, um Elemente zu definieren:

<xs:complexType name="tokenWithLang">
  <xs:simpleContent>
     <xs:extension base="xs:token">
        <xs:attribute ref="lang"/>
     </xs:extension>
  </xs:simpleContent>
</xs:complexType>
<xs:element name="title" type="tokenWithLang"/>

Ableitung einfacher Inhalte

Komplexe Typen stellen eine Reihe von Möglichkeiten zur Verfügung, um einfache Inhaltsmodelle zu erweitern.

Ableitung durch Erweiterung

Ableitung durch Erweiterung ist für komplexe Typen reserviert und hat keine Entsprechung bei einfachen Typen. Sie erhöht die Anzahl von Kindknoten-Elementen oder Attributen, die bei dem komplexen Typ erlaubt sind oder erwartet werden. Komplexen Typen einfachen Inhalts können keine Kindelemente hinzugefügt werden, deswegen bleibt uns nur eine Erweiterung, die mit der Methode übereinstimmt, mit der wir einen komplexen Typ einfachen Inhalts aus einem einfachen Typ erzeugt haben. Um dem komplexen Typ tokenWithLang, der im vorigen Beispiel gezeigt wurde, ein Attribut hinzuzufügen, könnten wir schreiben:

<xs:element name="title">
   <xs:complexType>
      <xs:simpleContent>
         <xs:extension base="tokenWithLang">
            <xs:attribute name="note" type="xs:token"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>
</xs:element>
Ableitung durch Einschränkung

Die Ableitung komplexer Typen einfachen Inhalts durch Einschränkung ist eine Möglichkeit, die sich an der Grenze zwischen den beiden Teilen von W3C XML Schema (Teil 1: Strukturen, Teil 2: Datentypen) befindet. Sie ist auch der Ableitung durch Einschränkung bei einfachen Datentypen sehr ähnlich. Der einzige Unterschied zwischen den Ableitungen durch Einschränkung in diesen beiden Zusammenhängen besteht darin, daß die Ableitung durch Einschränkung bei einem komplexen Typ einfachen Inhalts nicht nur eine Bereichseinschränkung für den Textknoten, sondern auch für das Attribut ermöglicht. Diese Einschränkung folgt dem gleichen Prinzip wie die Einschränkung eines einfachen Typs: Jede Instanzstruktur, die nach dem eingeschränkten Typ gültig ist, muß auch nach dem Grundtyp gültig sein (mit der einen bereits erwähnten Ausnahme für die Facette xs:whitespace).

Die Syntax, die zum Einschränken des Text-Kindknotens verwendet wird, ist dieselbe wie die, um einfache Typen durch Einschränkung abzuleiten. Die Facetten sind ebenfalls dieselben. Diesen Facetten muß die neue Liste der Attribute folgen, die andere Typen haben können, sofern sie von den Typen der entsprechenden Attribute des Grundtyps abgeleitet sind. Attribute, die im Grundtyp nicht vorgeschrieben sind, können in der neuen Liste als »prohibited« deklariert werden, und Attribute, die nicht genannt werden, werden unverändert übernommen. Es folgen einige Beispiele für Ableitungen, die mit einem Datentyp einfachen Inhalts beginnen, der mit dem eben gezeigten Inhaltsmodell übereinstimmt:

 <xs:complexType name="tokenWithLangAndNote">
      <xs:simpleContent>
         <xs:extension base="xs:token">
            <xs:attribute name="lang" type="xs:language"/>
            <xs:attribute name="note" type="xs:token"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>

Wir können zunächst zeigen, wie man die Länge des Textknotens beschränkt, wie wir es für einfache Typen getan haben:

<xs:element name="title">
      <xs:complexType>
         <xs:simpleContent>
            <xs:restriction base="tokenWithLangAndNote">
               <xs:maxLength value="255"/>
               <xs:attribute name="lang" type="xs:language"/>
               <xs:attribute name="note" type="xs:token"/>
            </xs:restriction>
         </xs:simpleContent>
      </xs:complexType>
   </xs:element>
    

Um das Attribut note aus dem Element title zu entfernen, deklarieren wir note in der Attribut-liste der Einschränkung als prohibited:

 <xs:element name="title">
      <xs:complexType>
         <xs:simpleContent>
            <xs:restriction base="tokenWithLangAndNote">
               <xs:maxLength value="255"/>
               <xs:attribute name="lang" type="xs:language"/>
               <xs:attribute name="note" use="prohibited"/>
            </xs:restriction>
         </xs:simpleContent>
      </xs:complexType>
   </xs:element>

Wir können den Datentyp auch einschränken, indem wir seine Attribute einschränken. Wenn wir beispielsweise die Anzahl möglicher Sprachen beschränken wollen, können wir das unmittelbar in der Definition des Attributs lang in dem abgeleiteten Typ tun:

 <xs:element name="title">
      <xs:complexType>
         <xs:simpleContent>
            <xs:restriction base="tokenWithLangAndNote">
               <xs:maxLength value="255"/>
               <xs:attribute name="lang">
                  <xs:simpleType>
                     <xs:restriction base="xs:language">
                        <xs:enumeration value="en"/>
                        <xs:enumeration value="de"/>
                     </xs:restriction>
                  </xs:simpleType>
               </xs:attribute>
            </xs:restriction>
         </xs:simpleContent>
      </xs:complexType>
   </xs:element>
Vergleich dieser beiden Methoden

Trotz scheinbarer Ähnlichkeiten haben Ableitungen durch Erweiterung und durch Einschränkung nicht viel mehr gemeinsam als die Ableitung neuer einfacher Inhaltstypen von Grundtypen. Ableitung durch Erweiterung kann nur neue Attribute hinzufügen. Sie kann weder den Datentyp des Textknotens noch den Typ eines Attributs, das in dem Grundtyp definiert ist, ändern. Die Ableitung durch Einschränkung scheint flexibler zu sein und kann die Datentypen des Textknotens und der Attribute des Grundtyps einschränken. Sie kann auch Attribute entfernen, die im Grund typ nicht als notwendig angegeben 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