Andere Alternativen

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

Die Elemente xs:include und xs:redefine bieten sichere Möglichkeiten, »Stücke« von Schemas einzubinden. Ihr Verarbeitungsmodell ist so angelegt, daß ein kohärentes Schema als Ergebnis entsteht. Der Preis für diese Sicherheit ist jedoch eine gewisse Starrheit: Nur vollständige Schema-Dokumente können auf diese Weise übernommen werden, und sie können nur auf globaler Ebene in ein Schema aufgenommen werden. (Beispielsweise ist es nicht möglich, nur einige der Definitionen in einem Schema zu übernehmen, andere jedoch nicht.) Aus den Regeln folgt, daß diese Möglichkeiten nicht genutzt werden können, um lokale Elemente zu übernehmen, etwa Anmerkungen oder häufig benutzte Facetten. Stellen wir uns zum Beispiel vor, wir wollten verlangen, daß all unsere Datumsangaben und verwandte Datentypen eine Zeitzone angeben und daß wir sehr hart gearbeitet haben, bis wir ein allgemeines Muster definiert hatten, das diese Beschränkung durchsetzt. Das könnte etwas wie das folgende sein:

<xs:pattern value=".+(Z|[+-].{5})"/>

Wir könnten benutzerdefinierte Datentypen für jedes der acht primitiven Zeitformate – die eine Zeitzonenangabe nach diesem Muster haben können – ableiten und unsere Schema-Designer bitten, nur diese Datentypen in ihren Schemas zu verwenden. Wir ziehen es jedoch vielleicht vor, ihnen dieses Muster an die Hand zu geben, das sie in ihren Schemas durch Verweis benutzen können, anstatt es zu kopieren. (Möglicherweise wollen wir es uns offenhalten, das Muster zu modifizieren, ohne alle Schemas aktualisieren zu müssen.) In diesem Fall können xs:include und xs:redefine nicht verwendet werden, und wir müssen eine der allgemeinen Inklusionsmethoden von XML in Erwägung ziehen, d.h. externe geparste Entities und XInclude.

Externe geparste Entities

Externe geparste Entities gehören zu den SGML-Einrichtungen, die XML über die DTDs geerbt hat. Wie der Name schon andeutet, handelt es sich hier um Entities (d.h. etwas, was man in der DTD deklarieren muß und später im Dokument referenzieren kann), die extern (d.h., ihr Ersetzungswert wird aus einer externen Datei gelesen, wenn sie referenziert werden) und geparst (d. h., ihr Inhalt wird geparst und dem Infoset des aufnehmenden Dokuments hinzugefügt) sind.

Um externe geparste Entities zu verwenden, erzeugen wir ein XML-Dokument mit dem Muster, das wir übernehmen wollen:

<?xml version="1.0"?>
<xs:pattern value=".+(Z|[+-].{5})"
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>

Die Angabe einer Namensraum-Deklaration in dieser Datei (die als externes geparstes Entity verwendet werden soll) ist strenggenommen nicht nötig, wenn wir sicher sind, daß dieses Entity stets in Dokumenten verwendet wird, in denen der Namensraum bereits mit demselben Präfix definiert worden ist. Auch in diesem Fall ist die Redefinition des Namensraums erlaubt, hat aber keine Wirkung. Die Angabe stellt jedoch sicher, daß der aufgenommene Schnipsel auch dann noch als zum Namensraum W3C XML Schema gehörig erkannt wird, wenn im aufnehmenden Dokument ein anderes Präfix verwendet worden ist. Um dieses Entity zu verwenden, muß es in der internen oder externen DTD unseres Schemas deklariert werden und kann dann in den Ableitungen referenziert werden:

<?xml version="1.0"?>
<!DOCTYPE xs:schema[
<!ENTITY TZ-pattern SYSTEM "pattern.ent">
]>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:simpleType name="myDate">
      <xs:restriction base="xs:date">
         &TZ-pattern;
      </xs:restriction>
   </xs:simpleType>
   <xs:element name="myDate" type="myDate"/>
</xs:schema>

Interessant hieran ist, daß feiner gegliedert werden kann, als wir es mit den Inklusionsmechanismen von W3C XML hätten erreichen können, die nur globale Komponenten verarbeiten. Der Preis, den wir für die Verwendung eines Allzweck-Inklusionsmechanismus wie den externen geparsten Entities (oder das im nächsten Abschnitt besprochene XInclude) bezahlen, besteht darin, daß diese Mechanismen nichts von der W3C-XML-Schema-Semantik implementieren und keine Redefinition zulassen. Über dieses einfache Beispiel hinaus können andere DTD-Möglichkeiten, beispielsweise interne geparste Entities und sogar Parameter-Entities, im Zusammenhang mit W3C XML Schema genutzt werden, um innovative Kombinationen zu produzieren.

XInclude

XInclude ist eine XML-Anwendung, die auf XPointer beruht und sich zur Zeit im Stadium einer W3C Candidate Recommendation befindet. XInclude wird am Ende die externen geparsten Entities ersetzen und kann auf ähnliche Weise wie diese benutzt werden. Die Hauptunterschiede bestehen darin, daß eine XInclude-Referenz nicht vor ihrer Verwendung deklariert werden muß und daß ein Fragment eines XML-Dokuments eingebunden werden kann. Dasselbe Beispiel kann dann unter Verwendung von XInclude implementiert werden, wobei wir die Möglichkeit ausnutzen können, das Muster über seine id zu holen, selbst wenn es innerhalb eines vollständigeren Schemas wie dem folgenden definiert ist:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:simpleType name="date">
      <xs:restriction base="xs:date">
         <xs:pattern value=".+(Z|[+-].{5})" id="TZ-pattern"/>
      </xs:restriction>
   </xs:simpleType>
   <xs:element name="myDate" type="myDate"/>
</xs:schema>

Da hier das Attribut id des Elements xs:pattern definiert ist, können wir die XPointer-Schreibweise mit »bloßen Namen« (»bare names«) verwenden, die es uns gestattet, den Wert einer id als Bezeichner für ein Fragment zu verwenden. In unserem Fall lautet die XPointer-Reference auf die Definition des xs:pattern demnach pattern.xsd#TZ-pattern. Wir können schreiben:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:xi="http://www.w3.org/2001/XInclude">
   <xs:simpleType name="myDateTime">
      <xs:restriction base="xs:dateTime">
         <xi:include href="pattern.xsd#TZ-pattern" parse="xml"/>
      </xs:restriction>
   </xs:simpleType>
   <xs:element name="myDate" type="myDateTime"/>
</xs:schema>

Hierbei sollte man beachten, daß XInclude noch im Entstehen begriffen ist und daß sich diese Schreibweise vielleicht noch ändert, bevor XInclude den Status einer W3C Recommendation erreicht. Außerdem sollte zum Lesen eines solchen Schemas ein Parser verwendet werden, der XInclude implementiert.

   

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