Leere Inhaltsmodelle

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

Leere Inhaltsmodelle sind Elemente, die nur Attribute akzeptieren können. W3C XML Schema unterstützt leere Inhaltsmodelle nicht besonders. Sie können entweder als komplexe Inhaltsmodelle ohne Elemente oder als einfache Inhaltsmodelle betrachtet werden, deren Wert auf den leeren String eingeschränkt ist.

Erzeugung leerer Inhaltsmodelle

W3C XML Schema betrachtet leere Inhaltsmodelle als Schnittmenge zwischen komplexen Inhaltsmodellen (solche, bei denen keine Kompositoren angegeben sind) und einfachen Inhaltsmodellen (solche, bei denen keine Textknoten erwartet werden, was W3C XML Schema so behandelt, als sei ein leerer Textknoten gefunden worden). Wir können daher zwischen den beiden Methoden wählen, um ein leeres Inhaltsmodell zu erzeugen. Als wir unser title-Element so erweitert haben, daß es gemischten Inhalt zuließ, haben wir es sorgfältig vermieden, leere Elemente hinzuzufügen, etwa die HTML-Elemente img oder br. Sehen wir uns nun an, wie wir mit den beiden Methoden ein Element br mit seinen Attributen id und class definieren könnten.

Als einfache Inhaltsmodelle

Dies geschieht, indem wir einen einfachen Typ definieren, der nur den leeren String als Wert akzeptieren kann. Strenggenommen akzeptieren leere Inhaltsmodelle keinerlei Whitespace zwischen ihrem Start- und ihrem End-Tag. Da wir darüber die Kontrolle brauchen, müssen wir einen Datentyp verwenden, der an dem Whitespace nichts ändert, also xs:string. Unser leeres Inhaltsmodell wird dann durch Erweiterung von diesem einfachen Typ abgeleitet.

   <xs:simpleType name="empty">
      <xs:restriction base="xs:string">
         <xs:enumeration value=""/>
      </xs:restriction>
   </xs:simpleType>


   <xs:element name="br">
      <xs:complexType>
         <xs:simpleContent>
            <xs:extension base="empty">
               <xs:attribute name="id" type="xs:ID"/>
               <xs:attribute name="class" type="xs:NMTOKEN"/>
            </xs:extension>
         </xs:simpleContent>
      </xs:complexType>
   </xs:element>

Als komplexe Inhaltsmodelle

Die andere, direktere Methode, um dies zu erreichen, besteht darin, ein komplexes Inhaltsmodell ohne jegliche Kindelemente zu erzeugen.

 <xs:element name="br">
      <xs:complexType>
         <xs:attribute name="id" type="xs:ID"/>
         <xs:attribute name="class" type="xs:NMTOKEN"/>
      </xs:complexType>
   </xs:element>

Ableitung aus leeren Inhaltsmodellen

Jeder der beiden leeren Inhaltstypen behält die Ableitungsmethoden seiner Inhaltsmodelle (einfach oder komplex) bei. Der Hauptunterschied zwischen diesen beiden Methoden besteht im wesentlichen darin, welche Ableitungen auf den Basistyp angewendet werden können und welche Auswirkungen dies hat.

Ableitung durch Erweiterung

Wenn wir uns daran erinnern, was wir über die Ableitung komplexer und einfacher Inhalte durch Erweiterung gelernt haben, und dies miteinander vergleichen, sehen wir, daß beide es erlauben, dem komplexen Typ neue Attribute hinzuzufügen. Während wir jedoch dem komplexen Inhalt neue Kindelemente hinzufügen können, ist es nicht möglich, den Typ des Textknotens für ein einfaches Inhaltsmodell zu ändern. Dies ist also der erste Unterschied zwischen den beiden Methoden: Wenn das leere Inhaltsmodell auf einem einfachen Typ aufbaut, kann außer Attributen nichts anderes hinzugefügt werden. Ist es jedoch auf einen komplexen Typ aufgebaut, kann es so erweitert werden, daß es Elemente akzeptiert.

Ableitung durch Einschränkung

Auf den ersten Blick sieht es so aus, als gäbe es hier weniger Unterschiede. Die Einschränkungsmethoden sowohl der einfachen als auch der komplexen Inhalte erlauben die Einschränkung des Bereichs der Attribute. Einschränkungen des Inhalts, der ohnedies leer ist, scheint nicht sehr interessant zu sein. Jetzt ist es jedoch an der Zeit, sich daran zu erinnern, was wir über eine Ableitungsfacette bei einfachen Typen gelernt haben, die in Wirklichkeit die Menge der gültigen Instanzdokumente erweitert. Der »leere« einfache Typ, den wir erzeugt haben, um unser leeres einfaches Inhaltsmodell abzuleiten, hat als Basistyp xs:string. Wenn von diesem einfachen Typ unter Verwendung von xs:whitespace etwas abgeleitet wird, kann dies eine Erweiterung der Menge zulässiger Instanzstrukturen ergeben. In unserem Fall bewirkt der Wert »collapse« für xs:whitespace, daß beliebige Folgen von Whitespace zwischen Start- und End-Tag akzeptiert werden. Dieser neue Typ ist strenggenommen nicht »leer«, kann jedoch für einige (oder sogar die meisten) Anwendungen sinnvoll sein, die Whitespace ohnedies normalisieren und daher zwischen den beiden Fällen nicht unterscheiden. Eine solche Ableitung kann mit dem komplexen Typ einfachen Inhalts auf die folgende Art umgesetzt werden:

   <xs:simpleType name="empty">
      <xs:restriction base="xs:string">
         <xs:enumeration value=""/>
      </xs:restriction>
   </xs:simpleType>

   <xs:complexType name="emptyBr">
      <xs:simpleContent>
         <xs:extension base="empty">
            <xs:attribute name="id" type="xs:ID"/>
            <xs:attribute name="class" type="xs:NMTOKEN"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>

   <xs:complexType name="almostEmptyBr">
      <xs:simpleContent>
         <xs:restriction base="emptyBr">
            <xs:whiteSpace value="collapse"/>
            <xs:attribute name="id" type="xs:ID"/>
            <xs:attribute name="class" type="xs:NMTOKEN"/>
         </xs:restriction>
      </xs:simpleContent>
   </xs:complexType>

Einfache oder komplexe Inhaltsmodelle für leere Inhaltsmodelle?

Wie wir gesehen haben, macht die Entscheidung für einen einfachen oder einen komplexen Typ keinen Riesenunterschied, außer was die Erweiterbarkeit angeht. Wenn wir die Möglichkeit offenhalten wollen, dem Inhaltsmodell durch Ableitung Kindelemente hinzuzufügen, wählen wir besser ein leeres komplexes Inhaltsmodell. Wenn wir jedoch Whitespace in einem abgeleiteten Typ akzeptieren können wollen, ist ein leeres einfaches Inhaltsmodell die bessere Alternative.

   

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