• +49-(0)721-402485-12
Ihre Experten für XML, XQuery und XML-Datenbanken

Definition komplexer Typen

Komplexe Typen werden benötigt, wenn modelliert werden soll, dass Elemente über Attribute, Kindelemente oder einen leeren Inhalt verfügen. Komplexe Typen können einen einfachen Inhalt (keine Kindelemente, aber Inhalt) oder einen komplexen Inhalt aufweisen.

Der einfache Inhalt kann entweder durch Erweiterung oder durch Einschränkung eines einfachen Typs definiert werden. Das folgende Beispiel definiert einen komplexen Typ mit einfachem Inhalt durch Erweiterung des XML-Schematyps string um ein Attribut.

<xs:complexType name="Station_T">
<xs:complexContent>
<xs:extension base="xs:string">
<xs:attribute name="Leitung" type="xs:string"
use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>

Folgendes Element entspricht dieser Typdefinition:

<Station Leitung="Schwester Anna">Radiologie</Station>

Dabei wird deutlich, dass der Name des Elementes unabhängig von seinem Typ ist – der Typname tritt in einem entsprechenden XML-Dokument nicht auf. Der Inhalt des Elementes ist einfach, enthält also keine Unterelemente. Trotzdem handelt es sich um einen komplexen Typ, da das Element über ein Attribut verfügt.

Komplexe Typen mit komplexem Inhalt erlauben die Angabe von Inhaltsmodellen, wobei drei Typen unterschieden werden:

  • sequence
    Die angeführten Unterelemente müssen in der spezifizierten Reihenfolge vorkommen.
  • choice
    Nur eines der angeführten Elemente darf auftreten.
  • all
    Alle aufgeführten Elemente dürfen maximal einmal auftreten, wobei ihre Reihenfolge beliebig ist.

Auch ein komplexer Typ mit komplexem Inhalt ist formal immer eine Erweiterung oder Einschränkung eines anderen Typs. Ist kein geeigneter anderer Typ vorhanden, kann auf den in XML Schema vordefinierten Urtyp anyType zurückgegriffen werden, wie das folgende Beispiel demonstriert:

<xs:complexType name="Operation_T">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:element name="Beschreibung" type="xs:string"/>
<xs:element name="Beginn" type="xs:dateTime" minOccurs="0"/>
<xs:element name="Ende" type="xs:dateTime" minOccurs="0"/>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Anästhesie" type="xs:string"/>
<xs:element name="Injektion" type="xs:string"/>
<xs:element name="Infusion" type="xs:string"/>
</xs:choice>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>

Da diese Einschränkung letztlich wenig aussagt, das Schema jedoch aufbläht, ist in diesem Fall eine verkürzte Schreibweise möglich:

<xs:sequence>
<xs:element name="Beschreibung" type="xs:string"/>
<xs:element name="Beginn" type="xs:dateTime" minOccurs="0"/>
<xs:element name="Ende" type="xs:dateTime" minOccurs="0"/>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Anästhesie" type="xs:string"/>
<xs:element name="Injektion" type="xs:string"/>
<xs:element name="Infusion" type="xs:string"/>
</xs:choice>
</xs:sequence>
</xs:complexType>

Das Beispiel zeigt, dass in sequence oder choice nicht nur Elemente, sondern auch weitere choice- oder sequence-Gruppen vorkommen dürfen. Außerdem demonstriert es die Verwendung der Häufigkeitsangaben bei Elementen. Werden minOccurs oder maxOccurs nicht angegeben, so wird jeweils der Wert 1 angenommen. Im Beispiel sind die Elemente Beginn und Ende optional, dürfen aber höchstens einmal auftreten, während die Elemente Anästhesie, Injektion und Infusion beliebig oft in beliebiger Reihenfolge erscheinen können. Folgendes Beispielelement genügt dieser Typdefinition:

<Operation>
<Beschreibung>Implantation einer Metallplatte</Beschreibung>
<Injektion>Schmerzmittel</Injektion>
<Injektion>Narkotikum</Injektion>
<Infusion>Kochsalzlösung</Infusion>
<Injektion>Kreislaufmittel</Injektion>
</Operation>

Bei einem leeren Elementinhalt handelt es sich um einen komplexen Inhalt, da ja kein textueller Inhalt erlaubt sein soll. Dieser kann als Einschränkung von anyType definiert werden, wobei höchstens Attribute angegeben werden, also beispielsweise:

<xs:complexType name="verbrauchter_Artikel_T">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:attribute name="Artikel_id" type="xs:string" use="required"/>
<xs:attribute name="Menge" type="xs:decimal" default="1.0"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>

oder kurz:

<xs:complexType name="verbrauchter_Artikel_T">
<xs:attribute name="Artikel_id" type="xs:string" use="required"/>
<xs:attribute name="Menge" type="xs:decimal" default="1.0"/>
</xs:complexType>

Dieses Beispiel zeigt auch die Häufigkeitsangaben für Attribute: use="required" signalisiert ein Attribut, das vorhanden sein muss, während use="optional" ein Attribut kennzeichnet, das auch entfallen darf (das ist die Voreinstellung). Ferner kann für ein Attribut ein Vorbelegungswert angegeben werden, der immer dann eingesetzt wird, wenn das Attribut nicht vorhanden ist. Für das Attribut Menge wird in diesem Fall immer der Wert 1.0 eingesetzt.

Auch hier wieder ein Beispiel für ein Element, das dieser Typdefinition entspricht:

<verbrauchter_Artikel Artikel_id="x1">

Gemischter Inhalt ("mixed content") wird durch Hinzufügen von mixed="true" als Attribut von complexContent spezifiziert.

Die Einschränkung von Typen mit komplexem Inhalt erfolgt dadurch, dass ein Typ definiert wird, der als Inhaltsmodell einen Ausschnitt aus dem Inhaltsmodell des eingeschränkten Typs hat: Alle Elemente oder Attribute, die bezüglich dieses Inhaltsmodells gültig sind, sind auch bezüglich des Inhaltsmodells des eingeschränkten Typs gültig. Einschränkungen können erfolgen

  • in der erlaubten Anzahl (Erhöhung von minOccurs und/oder Erniedrigung von maxOccurs),
  • durch Hinzufügen eines Vorbelegungswertes oder Setzen eines festen Wertes,
  • durch Weglassen einer optionalen Komponente,
  • durch Ersetzen eines einfachen Typs durch eine Einschränkung dieses Typs.

Der folgende Typ erlaubt nur noch höchstens eine Maßnahme in der Operation:

<xs:complexType name="Operation1_T">
<xs:complexContent>
<xs:restriction base="Operation_T">
<xs:sequence>
<xs:element name="Beschreibung" type="xs:string"/>
<xs:element name="Beginn" type="xs:dateTime" minOccurs="0"/>
<xs:element name="Ende" type="xs:dateTime" minOccurs="0"/>
<xs:choice minOccurs="0" maxOccurs="1">
<xs:element name="Anästhesie" type="xs:string"/>
<xs:element name="Injektion" type="xs:string"/>
<xs:element name="Infusion" type="xs:string"/>
</xs:choice>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>

Attribute werden automatisch vom eingeschränkten Typ übernommen. Sollen optionale Attribute nicht übernommen werden, so können sie durch Angabe von use="prohibited" im eingeschränkten Typ unterdrückt werden.

Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)

<< zurückvor >>