xs:key und xs:unique für Beschränkungen gemeinsamen Auftretens
(Auszug aus "XML Schema" von Eric van der Vlist)
Beschränkungen für gemeinsames Auftreten (Co-occurrence constraints) sind Abhängigkeitsbedingungen für Kindelemente oder Attribute eines Knotens, etwa: »Wenn dieses Element vorhanden ist, muß jenes Attribut fehlen.« Auch wenn sie in W3C XML Schema nur unzureichend implementiert sind, können solche Beschränkungen doch eine Umgehungsstrategie für die Regel von der konsistenten Deklaration sein, die die Definition zweier verschiedener Inhaltsmodelle für ein Element an ein und derselben Stelle in einem Instanzdokument verbietet. Mit Beschränkungen für gemeinsames Auftreten kann man eine Obermenge der beiden Inhaltsmodelle definieren und Beschränkungen hinzufügen, die die unerwünschten Kombinationen ausschließen. Dies ist häufig bei Vokabularen (wie etwa RDF) nützlich, bei denen einige Eigenschaften entweder als Attribut oder als Element ausgedrückt werden können. In diesem Sinne erweitern wir nun unser Buchbeispiel in der Form, daß es die Angabe von ISBN und Titel wahlweise als Attribut oder als Element akzeptiert. Die beiden folgenden Instanzdokumente sind dann gültig (wie auch die beiden verbleibenden Kombinationen):
oder:
<book id="b3810518883" available="true" isbn="3810518883"
title="Auf den Hund gekommen">
.../...
</book>
Der offensichtliche Weg liegt darin, das Element book als Auswahl zwischen den vier verschiedenen gültigen Inhaltsmodellen (mit den vier verschiedenen Kombinationen von Elementen und Attributen) zu definieren. Dies wird jedoch durch die Regel von der konsistenten Deklaration verboten, die besagt, daß nur ein einziges Inhaltsmodell für ein gegebenes Element verwendet werden darf. Der Ausweg besteht darin, ein Inhaltsmodell zu definieren, das sowohl optionale Elemente als auch Attribute akzeptiert:
<xs:complexType>
<xs:sequence>
<xs:element ref="isbn" minOccurs="0"/>
<xs:element ref="title" minOccurs="0"/>
<xs:element ref="author" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="character" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute ref="id"/>
<xs:attribute ref="available"/>
<xs:attribute ref="isbn"/>
<xs:attribute ref="title"/>
</xs:complexType>
Diese Definition läßt Instanzdokumente zu, die title (oder isbn) sowohl als Element wie auch als Attribut enthalten, aber auch Instanzdokumente ganz ohne title oder isbn. Wir müssen Beschränkungsregeln für gemeinsames Auftreten hinzufügen. Vollständig allgemein können solche Beschränkungen unter Verwendung von W3C XML Schema nicht ausgedrückt werden, und daher müssen wir andere Sprachen einbetten (wie unter Dokumentation von Schemas gezeigt). Wenn wir aber darüber nachdenken, können xs:unique , xs:key und xs:keyref als ganz spezielle Beschränkungen für gemeinsames Auftreten aufgefaßt werden, und sie können hier tatsächlich verwendet werden. Wenn wir sicherstellen wollen, daß wir genau einen Titel und eine ISBN haben, können wir einen xs:key im Element book selbst definieren:
<xs:key name="isbn">
<xs:selector xpath="."/>
<xs:field xpath="isbn|@isbn"/>
</xs:key>
<xs:key name="title">
<xs:selector xpath="."/>
<xs:field xpath="title|@title"/>
</xs:key>
Diese Schlüssel werden im Bereich eines Buchelements ausgewertet und haben keine Nebenwirkungen außerhalb des jeweiligen Buchelements. Sie sorgen dafür, daß das Buch ungültig ist, wenn der XPath-Ausdruck entweder keinen oder aber mehrere Knoten liefert. Hätten wir hingegen xs:unique anstelle von xs:key verwendet, hätten wir immer noch die Bedingung gehabt, daß nur höchstens ein Element oder Attribut vorläge, aber damit wäre die Eigenschaft optional geworden. Der Vollständigkeit halber sei hier noch einmal die gesamte Definition des Elements book angegeben:
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element ref="isbn" minOccurs="0"/>
<xs:element ref="title" minOccurs="0"/>
<xs:element ref="author" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="character" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute ref="id"/>
<xs:attribute ref="available"/>
<xs:attribute ref="isbn"/>
<xs:attribute ref="title"/>
</xs:complexType>
<xs:key name="isbn">
<xs:selector xpath="."/>
<xs:field xpath="isbn|@isbn"/>
</xs:key>
<xs:key name="title">
<xs:selector xpath="."/>
<xs:field xpath="title|@title"/>
</xs:key>
</xs:element>
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