Gemischte Inhaltsmodelle

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

Obwohl W3C XML Schema gemischte Inhaltsmodelle zuläßt und sie besser beschreibt, als die DTDs von XML dies tun, werden sie doch wie nachträglich auf komplexe Inhaltsmodelle aufgepfropft behandelt. Das Gute daran ist, daß dies Kontrolle über die Kindelemente in genau der gleichen Weise gewährt, wie wir es für komplexe Inhalte gerade kennengelernt haben. Schlecht ist daran jedoch, daß wir jede Kontrolle über die Text-Kindknoten aufgeben, die überhaupt nicht eingeschränkt werden können. Außerdem unterliegen die Beschreibungen der Kindelemente natürlich genau den gleichen Beschränkungen wie im Fall der komplexen Inhaltsmodelle. Die Beschränkungen für ungeordnete Inhaltsmodelle sind bei gemischten Inhaltsmodellen, die stärkeren »Freistilcharakter« haben, wahrscheinlich sogar noch unfreundlicher als bei komplexen Inhaltsmodellen.

Erzeugung gemischter Inhaltsmodelle

Diese zusätzliche Konstruktion ist mit Hilfe des Attributs mixed bei xs:complexType (globale Definition) implementiert. Im übrigen ist die Verwendung genau die gleiche wie bei den komplexen Inhaltsmodellen. Wenn der Wert dieses Attributs auf true gesetzt ist, bewirkt dies, daß beliebige Textknoten in dem Inhaltsmodell erlaubt sind, und zwar vor, zwischen und nach den Kindelementen. Der Ort, die Whitespace-Verarbeitung und der Datentyp dieser Textknoten kann in keiner Weise eingeschränkt werden.

Kehren wir zur Definition unseres Elements title zurück und ändern es so ab, daß es eine reduzierte Form von XHTML akzeptiert, so daß man mit a einen Link angeben und mit dem Element em einige Teile des Textes hervorheben kann. Die Definition, die bisher in der Erweiterung eines einfachen Typs zu einem komplexen Typ einfachen Inhalts bestand, muß als Definition komplexen Inhalts, dessen Attribut mixed den Wert true hat, neu geschrieben werden. Die vollständige Definition, einschließlich der Definition des Elements a, der Definition eines komplexen Typs markedText und seiner Benutzung zur Definition des Elements title, könnte so aussehen:

<xs:element name="a">
   <xs:complexType>
      <xs:simpleContent>
         <xs:extension base="xs:string">
            <xs:attribute name="href" type="xs:anyURI"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>
</xs:element>

<xs:complexType name="markedText" mixed="true">
   <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="em" type="xs:token"/>
      <xs:element ref="a"/>
   </xs:choice>
   <xs:attribute ref="lang"/>
</xs:complexType>
<xs:element name="title" type="markedText"/>

Diese Definition paßt auf Elemente wie:

<title lang="de">
   Auf
   <em>
      den
   </em>
   <a href="http://dmoz.org/Shopping/Pets/Dogs/">
      Hund
   </a>
   gekommen
</title>

Die Länge des Titels kann hier nicht mehr eingeschränkt werden.

Ableitung gemischter Inhaltsmodelle

Gemischte Inhaltsmodelle werden genau wie die komplexen Inhaltsmodelle abgeleitet, auf die sie aufgepfropft sind. Die Semantik beider Methoden bleibt unverändert.

Ableitung durch Erweiterung

Komplexe Typen gemischten Inhalts können durch Erweiterung aus anderen komplexen Typen komplexen Inhalts abgeleitet werden, und die Bedeutung bleibt dieselbe. Wenn ich meinem gemischten Inhaltstyp markedText ein Element strong hinzufügen will, kann ich das folgende Inhaltsmodell definieren:

<xs:element name="title">
   <xs:complexType mixed="true">
      <xs:complexContent mixed="true">
         <xs:extension base="markedText">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
               <xs:element name="strong" type="xs:string"/>
            </xs:choice>
         </xs:extension>
      </xs:complexContent>
   </xs:complexType>
</xs:element>

Hier ist jedoch anzumerken, daß diese Erweiterung zu dem folgenden äquivalent ist:

<xs:complexType name="resultingType" mixed="true">
   <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
         <xs:element name="em" type="xs:token"/>
         <xs:element ref="a"/>
      </xs:choice>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
         <xs:element name="strong" type="xs:string"/>
      </xs:choice>
   </xs:sequence>
   <xs:attribute ref="lang"/>
</xs:complexType>

Das ist wahrscheinlich nicht das, was wir in der Praxis gern hätten, denn dieses Inhaltsmodell erwartet, daß sämtliche a und em vor dem ersten Auftreten von strong vorkommen. Wir werden später (unter Objektorientierte Konstruktion weiterer Bausteine) sehen, daß dieses spezielle Problem mit Hilfe einer Konstruktion namens »Ersetzungsgruppe« anstelle von xs:choice gelöst werden kann.

Ableitung durch Einschränkung

Die Ableitung gemischter Inhaltsmodelle durch Einschränkung geschieht ebenfalls mit der Methode, die für komplexe Inhaltsmodelle festgelegt wurde. Auch hier gilt dieselbe Beschränkung, daß jede Partikel ausdrücklich eine Ableitung der entsprechenden Partikel des Basistyps sein muß. Um die Konsequenzen dieser Einschränkung zu veranschaulichen, sehen wir uns noch einmal die Definition und die Verwendung unseres markedText an:

<xs:element name="a">
   <xs:complexType>
      <xs:simpleContent>
         <xs:extension base="xs:string">
            <xs:attribute name="href" type="xs:anyURI"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>
</xs:element>


<xs:complexType name="markedText" mixed="true">
   <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="em" type="xs:token"/>
      <xs:element ref="a"/>
   </xs:choice>
   <xs:attribute ref="lang"/>
</xs:complexType>
<xs:element name="title" type="markedText"/>

Wenn wir em-Elemente in unserem Titel verbieten, href auf absolute HTTP-URIs einschränken und das Attribut lang auf die Werte en und de beschränken wollen, müssen wir einiges an Umstrukturierung vornehmen, um nachzuweisen, daß das in unserem Titel enthaltene Element a eine explizite Ableitung der allgemeinen Definition von a ist. Wir müssen außerdem eine globale komplexe Typdefinition anstelle der bisherigen anonymen Definition für a verwenden.

<xs:element name="a" type="link"/>

Wir können nun entweder einen neuen globalen komplexen Typ von dem neuen komplexen Typ link ableiten oder aber seine Ableitung in die Definition des Elements title einbetten.

<xs:element name="title">
   <xs:complexType mixed="true">
      <xs:complexContent mixed="true">
         <xs:restriction base="markedText">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
               <xs:element name="a">
                  <xs:complexType>
                     <xs:simpleContent>
                        <xs:restriction base="link">
                           <xs:attribute name="href">
                              <xs:simpleType>
                                 <xs:restriction base="xs:anyURI">
                                    <xs:pattern value="http://.*"/>
                                 </xs:restriction>
                              </xs:simpleType>
                           </xs:attribute>
                        </xs:restriction>
                     </xs:simpleContent>
                  </xs:complexType>
               </xs:element>
            </xs:choice>
            <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:complexContent>
   </xs:complexType>
</xs:element>

Dieses Beispiel ist eine Karikatur. In der Praxis wäre es lesbarer, einen globalen Hilfstyp zu definieren, um die Einbettung mehrerer Ableitungen zu vermeiden, das Beispiel gibt jedoch einen Überblick über den Ableitungsvorgang.

Ableitungen zwischen komplexen und gemischten Inhaltsmodellen

Da komplexe und gemischte Inhaltsmodelle nach den gleichen Mechanismen aufgebaut werden, kann man sich fragen, wie die Möglichkeiten aussehen, komplexe Inhalte aus gemischten Inhalten und umgekehrt abzuleiten. Die Antwort auf diese Frage versteckt sich in der Semantik der beiden Ableitungsmethoden.

Ableitung durch Erweiterung hängt neuen Inhalt hinten an den Inhalt des Basistyps an und behält die Struktur des Basistyps unverändert bei. Es ist daher unmöglich, ein gemischtes Inhaltsmodell von einem komplexen abzuleiten. Wenn ein Inhaltsmodell gemischt ist, kann die Position der Textknoten nicht eingeschränkt werden, und das erlaubt Textknoten innerhalb des Basistyps an beliebigen Stellen. Aus dem gleichen Grund ist es unmöglich, ein gemischtes Inhaltsmodell zu einem komplexen zu erweitern, weil dann die Textknoten, die in dem Basistyp erlaubt wären, auf einmal verboten wären.

Ableitung durch Einschränkung definiert eine Untermenge des Basistyps. Es ist verboten, ein gemischtes Inhaltsmodell von einem komplexen Inhaltsmodell abzuleiten. Der resultierende Typ würde Textknoten erlauben, die in dem Basistyp verboten sind, und würde daher das Inhaltsmodell erweitern, statt es einzuschränken. Es gibt jedoch eine funktionierende Möglichkeit, nämlich die letzte verbleibende Kombination: Ein gemischtes Inhaltsmodell kann so eingeschränkt werden, daß sich ein komplexes ergibt. Die Textknoten eines gemischten Inhaltsmodells zu verbieten ist eine zulässige Einschränkung. Sie kann vorgenommen werden, indem man das Attribut mixed in der Definition des xs:complexType auf false setzt. Es ist sogar möglich, ein gemischtes Inhaltsmodell durch Ableitung zu einem einfachen zu machen, da dies in Wirklichkeit nur eine Einschränkung ist, bei der die Geschwisterknoten entfernt und die Textknoten beibehalten werden. Das setzt natürlich voraus, daß die Geschwisterknoten optional sind, d.h., daß ihr Attribut minOccurs den Wert 0 hat.

   

<< 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