next up previous contents
Nächste Seite: 2.6 Namensräume Aufwärts: 2 XML Schema Vorherige Seite: 2.4 Definition einfacher Datentypen   Inhalt


2.5 Definition komplexer Datentypen und Elemente

Einfache Datentypen haben keinen Einfluß auf die Beziehung der Elemente untereinander. Die Struktur, die das Auftreten der Elemente bestimmt, wird durch komplexe Datentypen definiert. Sie beschreiben die Struktur eines Dokumentes anhand der in sie geschachtelten Elemente und ihrer Reihenfolge. So gibt es Elemente, die sich aus anderen zusammensetzen lassen. Bei dieser Art der Strukturbeschreibung gibt es drei verschiedene Möglichkeiten:
  1. Die all-Umgebung besitzt keine Reihenfolge. Alle aufgezählten Elemente können somit in beliebiger Reihenfolge auftauchen. Es besteht nur die Möglichkeit ein Element als optional zu deklarieren. Angaben über ein mehrfaches Auftreten eines Elementes sind allerdings nicht möglich.
  2. In einer sequence lässt sich die Reihenfolge der Elemente oder auch anderer Inhalte wie Gruppen (in Kapitel 2.7 folgt eine genauere Beschreibung) festlegen und die Häufigkeit bestimmen. Elemente können dabei genau einmal auftreten, optional sein oder auf einen beliebig großen Wert bis zu unendlich hin festgesetzt werden. Standardmäßig müssen Elemente genau einmal auftreten. Sequenzen bieten die Möglichkeit ineinander geschachtelt zu werden. Dadurch ist es auch möglich Sequenzen von Sequenzen zu bilden.
  3. Die letzte Möglichkeit Elemente zu schachteln, ist die Auswahl mit dem Element choice. Hierbei lassen sich verschiedene Elemente, Gruppen oder auch Sequenzen angeben, die wahlweise benutzt werden können. Auch das choice-Element lässt sich ineinander schachteln. Innerhalb dieser Umgebung können den Elementen beliebige Werte für die Anzahl ihres Auftretens mitgeben werden.
Beispiel 2.5.1:
Eine Adresse setzt sich aus verschiedenen Elementen (dem Namen der Person, der Straße, der Postleitzahl und der Stadt) zusammen. Die Adresse ist als Sequenz realisiert, wodurch die Elemente in der angegebenen Reihenfolge vorkommen müssen und mit Ausnahme der optionalen Straße nur genau einmal auftreten dürfen.
<xs:element name="adresse">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="name" type="xs:string"/>
   <xs:element name="strasse" type="xs:string" 
                                 minOccurs="0"/>
   <xs:element name="PLZ" type="xs:nonNegativeInteger"/>
   <xs:element name="Stadt" type="xs:string"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>
Dieses Beispiel lässt sich anstatt mit einer Sequenz auch ohne weiteres unter Verwendung des all-Elementes realisieren. Das liegt daran, dass zum einen die Reihenfolge vernachlässigbar ist und zum anderen die auftretenden Elemente maximal einmal vorkommen dürfen. Solche Definitionen lassen sich sowohl direkt in Elementen vornehmen, als auch in benannten komplexen Datentypen. Wird diese Definition in einem Datentyp realisiert, so lässt er sich für unterschiedliche Elemente wiederverwenden. Das findet auf die gleiche Art statt, wie es auch bei Elementen eines einfachen Typs der Fall ist, indem der Name des Typs im entsprechenden Attribut angegeben wird. Bei der Definition komplexer Datentypen unterscheidet man grundsätzlich drei verschiedene Arten von komplexen Inhalten. Die eine Art beruht auf der Erweiterung oder Einschränkung einfacher oder komplexer Typen. In Kapitel 2.4 wurden nur einfache Typen definiert, die keine Elemente oder Attribute enthalten können. Diese einfachen Typen können nun als Grundlage eines neuen komplexen Typs dienen. Durch das simpleContent-Element wird der einfache Typ innerhalb der komplexen Typdefinition referenziert. Auf dieser Basis können nun spezielle komplexe Merkmale dem Typ hinzugefügt werden. In diesem Fall lässt sich der ursprünglich einfache Typ um eines oder mehrere Attribute zu einem komplexen Datentypen ergänzen.

Beispiel 2.5.2:
Zur Angabe eines Bildes soll neben der URI mit Hilfe eines Attributes das Format eingetragen werden. Dazu reicht es einen Datentyp zu schaffen, der auf einem einfachen Typ, nämlich der xs:anyURI, beruht und diesen durch eine Erweiterung um ein Attribut des zuvor definierten einfachen Typen grafikformat ergänzt.
<xs:complexType name="bild">
  <xs:simpleContent>
    <xs:extension base="xs:anyURI">
    	<xs:attribute name="format" type="grafikformat"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>
Ein Element mit dem Namen grafik von diesem Typ bild würde in einer Beispielausprägung des Schemas etwa folgendermaßen aussehen:
<grafik format="jpg">C:/bild.jpg</grafik>
Auf diese Art erzeugte Datentypen sind zwar komplex, aber lassen sich auch wieder als Grundlage für andere Datentypen im simpleContent benutzen. Damit lassen sich auch Einschränkungen realisieren, die nicht durch die Restriktionen auf einen einfachen Typ abgebildet werden können. Beispielsweise lässt sich ein zuvor erweiterter Typ in seiner Zeichenanzahl eingeschränken oder seine hinzugefügten Attribute lassen sich als verboten deklarieren. Liegt der Definition eines komplexen Datentyps ein einfacher Typ zugrunde, so beziehen sich seine komplexen Eigenschaften ausschließlich auf die Ergänzung um Attribute. Komplexe Typen können daher nicht als Grundlage von Attributen dienen. Diese werden ausschließlich durch einfache Typen erzeugt. Eine weitere Möglichkeit komplexe Typen zu erzeugen besteht in der Beschreibung der Struktur. Wie schon im Beispiel 2.5.1 gezeigt, lassen sich Elemente aus anderen Elementen zusammensetzen. Das kann mit und ohne Reihenfolge realisiert werden. Bei dieser grundsätzlichen Art der Strukturbeschreibung ist die Angabe, dass es sich um einen komplexen Inhalt handelt, nicht nötig. Erst wenn ein komplexer Datentyp erweitert oder eingeschränkt werden soll, muss das festgelegt werden. Diese Veränderungen sind sehr ähnlich zu denen bei einfachen Typen. Mit Erweiterungen lassen sich Elemente, Gruppen oder Attribute zu einem Typ hinzufügen. Allerdings betrifft dies nur das Anhängen an das Ende des zugrunde liegenden Datentyps. Eine Umstrukturierung der vorhandenen Elemente bezüglich ihrer Reihenfolge läßt sich nicht realisieren. Durch Restriktionen können Elemente oder Attribute in ihrem Auftreten eingeschränkt werden. Hierbei ist stets zu berücksichtigen, dass ein Element des resultierenden Datentyps auch nach dem Typ gültig sein muss, der die Grundlage geliefert hat. Das bedeutet, dass kein Element oder Attribut verboten werden kann, welches zuvor zwingend erforderlich war. Es können also nur Einschränkungen auf optionale Eigenschaften getroffen werden.

Beispiel 2.5.3:
Die Einschränkung des komplexen Datentyps adresse aus Beispiel 2.5.1 auf den Namen der Person, Postleitzahl und Adresse ist ein typisches Beispiel für Restriktionen. Das zuvor optionale Element Strasse fällt hier weg. Jedes Element vom neuen Typ nameort ist somit auch nach dem alten Typ adresse gültig. Die anderen Elemente mussten alle aufgezählt werden und durften nicht wegfallen, da bei ihnen keine Angaben zur Anzahl des Auftretens gemacht wurden und somit der Standard besagt, dass diese Elemente genau einmal auftreten müssen.
<xs:complexType name="nameort">
 <xs:complexContent>
  <xs:restriction base="adresse">
   <xs:sequence>
    <xs:element name="name" type="xs:string"/>
    <xs:element name="PLZ" type="xs:nonNegativeInteger"/>
    <xs:element name="Stadt" type="xs:string"/>
   </xs:sequence>
  </xs:restriction>
 </xs:complexContent>
</xs:complexType>
Eine letzte Möglichkeit einen Typ zu erzeugen liegt in der Kombination von einfachen und komplexen Elementeigenschaften. Dazu lässt sich bei einem komplexen Datentypen das mixed-Attribut auf true setzen. Ein komplexer Datentyp, der mixed ist, kann neben den angegebenen Elementen auch einfachen Text enhalten. Ein Element diesen Typs ist dadurch frei in seiner Kombination aus Elementen und beliebigem Text.

Beispiel 2.5.4:
Zur Definition eines beliebigen Textes mit Elementen wird das Attribut mixed eingesetzt. So wird das boldtext Element als komplex definiert, das aus Text besteht und optional auch ein bis beliebig viele bold-Elemente enthalten kann.
<xs:element name="boldtext">
  <xs:complexType mixed="true">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="bold" type="xs:string"/>
    </xs:choice>
  </xs:complexType>
</xs:element>
Die folgende beispielhafte Ausprägung des oben definierten Elementes boldtext, wird von einem XML-Parser als gültig validiert:
<boldtext>Hier steht <bold>ein Element</bold> im Text 
          und ein zweites <bold>ist hier</bold>
          und es geht weiter...
</boldtext>

next up previous contents
Nächste Seite: 2.6 Namensräume Aufwärts: 2 XML Schema Vorherige Seite: 2.4 Definition einfacher Datentypen   Inhalt
Tanja Schniederberend 2003-06-11