Ableitung
Den Begriff Ableitung kennen Sie vielleicht von der Objektorientierung bzw., um es genauer zu sagen, von der Vererbung. Die Bedeutung in XSD hat zwar Parallelen, darf jedoch keineswegs gleichgesetzt werden. Unter Ableitung (im Sinne von XML Schema) versteht man im Allgemeinen das Erweitern oder Einschränken eines bestehenden Datentyps. In den nächsten zwei Abschnitten werden wir diese beiden Arten der Ableitung genauer erläutern.
Erweiterung
Eine Erweiterung eines Datentyps wird mit dem extension
-Element durchgeführt. Dieses wird dem simpleContent
-
oder complexContent
-Element untergeordnet. Innerhalb des extension
-Elements können Sie dann angeben,
welche Inhalte erweitert werden sollen (z. B. eine Sequenz oder ein Attribut). Über das Attribut base
wird
im extension
-Element festgelegt, von welchem Datentyp der neu definierte Datentyp abgeleitet werden soll. Im
folgenden Beispiel definieren wir die Datentypen computer
und laptop
. Der laptop
-Datentyp
wird vom computer
-Datentyp abgeleitet und um ein Element erweitert:
<xs:complexType name="computer"> <xs:sequence> <xs:element name="prozessor" type="xs:string" /> <xs:element name="arbeitsspeicher" type="xs:string" /> <xs:element name="festplatte" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:complexType name="laptop"> <xs:complexContent> <xs:extension base="computer"> <xs:sequence> <xs:element name="display" type="xs:string" /> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType>
Übrigens: Das extension
-Element haben wir im Thema Komplexe Typen
bereits dazu verwendet, einen komplexen Datentyp zu definieren, welcher aus einem direkten Inhalt (einfacher Typ) und einem
Attribut besteht.
Einschränkung
Das Element restriction
kann dazu verwendet werden, Einschränkungen zu definieren. Sie haben das Element ja bereits
im vorherigen Thema kennengelernt. Dort haben wir das Element
aber nur dazu verwendet, Einschränkungen auf einfache Typen (z. B. eine Längenangabe oder einen Wertebereich) anzuwenden. Es ist
aber möglich, bestehende komplexe Datentypen einzuschränken. Der Basistyp, also der Datentyp von welchem abgeleitet werden soll,
wird im restriction
-Element über das Attribut base
festgelegt. Im abzuleitenden Datentyp müssen Sie
alle Elemente und Attribute des ursprünglichen Datentyps wiederholen. Der Wert von Attributen wie z. B. minOccurs
und maxOccurs
kann natürlich durch eine Einschränkung verändert werden.
<xs:complexType name="person"> <xs:sequence> <xs:element name="vorname" type="xs:string" minOccurs="0" /> <xs:element name="name" type="xs:string" /> <xs:element name="strasse" type="xs:string" /> <xs:element name="hausnr" type="xs:string" /> <xs:element name="plz" type="xs:string" /> <xs:element name="ort" type="xs:string" /> </xs:sequence> <xs:attribute name="alter" type="xs:integer" /> </xs:complexType> <xs:complexType name="firma"> <xs:complexContent> <xs:restriction base="person"> <xs:sequence> <xs:element name="name" type="xs:string" /> <xs:element name="strasse" type="xs:string" /> <xs:element name="hausnr" type="xs:string" /> <xs:element name="plz" type="xs:string" /> <xs:element name="ort" type="xs:string" /> </xs:sequence> <xs:attribute name="alter" type="xs:integer" use="prohibited" /> </xs:restriction> </xs:complexContent> </xs:complexType>
Wichtig: Bei der Einschränkung kann ein Datentyp nicht so eingeschränkt werden, dass er mit dem ursprünglichen Datentyp
komplett inkompatibel ist, d. h. das Weglassen des Elements vorname
im XSL Schema des Datentyps firma
im obigen Beispiel ist nur deshalb erlaubt, weil es im Datentyp person
optional ist (minOccurs="0"
).
Attribute können hingegen über den Wert prohibited
im use
-Attribut verboten werden. Auf Grund der
genannten „Problematik“ bei Elementen bzw. der Umständlichkeit bei der Einschränkung von Datentypen wird meistens die Erweiterung
von Datentypen bei der Ableitung vorgezogen.