XML-Know How

Benutzerdefinierte Datentypen in XSD

Mit XSD kann man bis zu einem gewissen Grad eigene Datentypen schaffen, sogenannte »abgeleitete Datentypen«. »Abgeleitet« bedeutet, dass eigene Datentypen immer auf Grundlage eines schon vordefinierten Datentyps gebildet werden. Angenommen, Sie haben innerhalb eines XML-Dokuments das Element <alter>. Der Inhalt dieses Elements soll eine ganze Zahl zwischen 0 und 140 sein. Grundlage ist daher der XSD-Datentyp »xs:integer«. Dieser Datentyp muss auf den Wertebereich 0 bis 140 eingeschränkt werden.

Die XSD-Deklaration für das Element <alter> sähe so aus:

<xs:element name="alter">
   <xs:simpleType>
      <xs:restrictionbase="xs:integer">
         <xs:minInclusivevalue="0"/>
         <xs:maxInclusivevalue="140"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

Zunächst wird durch <xs:element> das Element <alter> deklariert. Mit <xs:simpleType> wird sodann angegeben, dass es sich um ein einfaches Element handelt. Die Typangabe per type-Attribut, wie sie sonst für einfache Elemente üblich ist, entfällt dadurch. <xs:simpleType> dient nun als Container für weitere Angaben zum Datentyp des Elements <alter>. In unserem Beispiel ist das die Eingrenzung (restriction) des Wertebereichs von »xs:integer« durch <xs:restriction>.

Mit dem Attribut base in <xs:restriction> wird zunächst eine sogenannte Basis angegeben. Das ist der XSD-Standard-Datentyp, der genauer eingegrenzt werden soll, hier »xs:integer«. Die folgenden XSD-Elemente <xs:minInclusive> und <maxInclusive> definieren mittels value-Attributen den gewünschten Minimal- und Maximalwert.

Welche Einschränkungen eines Basis-Datentyps möglich sind, hängt davon ab, welchen Basistyp Sie verwenden.

Die Typ-Definition für <alter> steht in diesem Beispiel innerhalb der Deklaration des <alter>-Elements und ist somit nur für dieses Element gültig. Es ist aber auch möglich, eine Typ-Definition separat anzulegen, ihr einen Namen zu geben und sie dann wie die vordefinierten Datentypen mittels ihres Namens aufzurufen (globale Deklaration). So können Sie den Datentyp einmal definieren und dann auf verschiedene Elemente oder Attribute anwenden.

Im Folgenden wird der Wertetyp »alter« separat definiert:

<xs:simpleType name="alter">
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="140"/>
  </xs:restriction>
</xs:simpleType>

Das folgende Beispiel definiert ein Attribut höchstalter unter Nutzung des selbstdefinierten Datentyps alter:

<xs:attribute name="höchstalter" type="alter" />