xs:keyref

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

Definition einer Schlüsselreferenz.

<xs:keyref
    id = xs:ID
    name = xs:NCName
    refer = xs:QName
    {beliebige Attribute mit einem Nicht-Schema-Namensraum}
    >
    Content: ((xs:annotation?), (xs:selector, xs:field+))
</xs:keyref>

Kann auftreten innerhalb von: xs:element (innerhalb von xs:all), xs:element (Verweis oder lokale Definition), xs:element (globale Definition)

Beschreibung

xs:keyref wird verwendet, um eine Referenz auf einen einfachen oder zusammengesetzten Schlüssel oder auf eine Eindeutigkeitsbedingung zu definieren.

Die Syntax von xs:keyref ist derjenigen von xs:key oder xs:unique sehr ähnlich. Der einzige Unterschied besteht in dem Attribut refer, das den Namen des referenzierten Schlüssels bzw. der Eindeutigkeitsbedingung enthalten muß.

Das Wurzelelement für keyref ist das Element, in dem der Schlüssel definiert ist. Die Schlüssel-Referenz wird oft mit demselben Wurzelelement definiert wie der referenzierte Schlüssel bzw. die Eindeutigkeitsbedingung; in diesem Fall ist das Matching einfach und unmittelbar einleuchtend.

Das Wurzelelement für keyref kann auch in jedem der Elemente definiert sein, für die es im Geltungsbereich einer passenden Bedingungsknotentabelle liegt, d.h. in allen Ahnen des Wurzelelements des referenzierten Schlüssels bzw. der Eindeutigkeitsbedingung. In diesem Fall wird eine zusätzliche Prüfung vorgenommen: Für jede passende Schlüssel-Referenz sollte der Validierer testen, ob der Schlüssel bzw. der eindeutige Wert nur einmal in allen passenden Wurzelelementen des Schlüssels bzw. der Eindeutigkeitsbedingung definiert ist.

Einschränkungen

Schlüssel-Referenzen, die in einem Ahnen des referenzierten Schlüssels bzw. der Eindeutigkeitsbedingung definiert sind, erlegen dem referenzierten Schlüssel bzw. der Eindeutigkeitsbedingung sogar zusätzliche Bedingungen auf, was überraschend sein kann. Eine Menge von Bezeichnern, die zu einem Schlüssel bzw. einer Eindeutigkeitsbedingung passen, kann ungültig werden, wenn eine Schlüssel-Referenz definiert wird.

Wenn beispielsweise lokale Schlüssel definiert werden, um Figuren im Geltungsbereich eines Buchs zu identifizieren, würden diese Schlüssel die Wiederverwendung derselben Figurenbezeichner in verschiedenen Büchern zulassen, wie in dem folgenden Beispiel:

<book>
    <isbn>3810518883</isbn>
    <title>Auf den Hund gekommen</title>
    <character id="PP">
        <name>Peppermint Patty</name>
        <qualification>kühn, dreist und draufgängerisch</qualification>
    </character>
    <character id="Snoopy">
        <name> Snoopy </name>
        <qualification>Held des Buches</qualification>
    </character>
    <character id="Schroeder">
        <name> Schroeder </name>
        <qualification>brachte die klassische Musik in die Peanuts-Comics ein</qualification>
    </character>
    <character id="Lucy">
        <name>Lucy</name>
        <qualification>herrschsüchtig, kratzbürstig und egoistisch</qualification>
    </character>
</book>
<book>
    <isbn>3810518719</isbn>
    <title>Alles Peanuts</title>
    <character id="Sally">
        <name>Sally Brown</name>
        <qualification>sucht immer nach dem leichten Ausweg</qualification>
    </character>
    <character id="Snoopy">
        <name>Snoopy</name>
        <qualification>extrovertierter Beagle</qualification>
    </character>
</book>

Wenn wir eine Schlüssel-Referenz hinzufügen, um diese Schlüssel von den Büchern aus zu referenzieren, ist die Verwendung derselben Bezeichner für Figuren in unterschiedlichen Büchern genau dann zulässig, wenn diese Schlüssel nicht referenziert werden.

Folgendes Beispiel ist dann gültig, weil »Sally« ein eindeutiger Schlüssel ist:

<library>
    <book>
        <isbn>3810518883</isbn>
        <title>Auf den Hund gekommen</title>
        <character id="PP">
            <name>Peppermint Patty</name>
            <qualification>kühn, dreist und draufgängerisch</qualification>
        </character>
        <character id="Snoopy">
            <name>Snoopy</name>
            <qualification>Held des Buches</qualification>
        </character>
        <character id="Schroeder">
            <name>Schroeder</name>
            <qualification>brachte die klassische Musik in die Peanuts-Comics ein</qualification>
        </character>
        <character id="Lucy">
            <name>Lucy</name>
            <qualification>herrschsüchtig, kratzbürstig und egoistisch</qualification>
        </character>
    </book>
    <book>
        <isbn>3810518719</isbn>
        <title>Alles Peanuts</title>
        <character id="Sally">
            <name> Sally Brown </name>
            <qualification>sucht immer nach dem leichten Ausweg</qualification>
        </character>
        <character id="Snoopy">
            <name>Snoopy</name>
            <qualification>extrovertierter Beagle</qualification>
        </character>
    </book>
    <comment about="Sally">Sally ist süß</comment>
</library>

Das Beispiel würde ungültig, wenn wir ein Kommentarelement hinzufügen, das sich auf »Snoopy« bezieht, der zweimal erwähnt wird.

Ein vollständiges Schema für dieses Dokument könnte das folgende sein (beachten Sie, daß xs:keyref sich auf eine xs:unique-Bedingung bezieht, die für ein Kind des aktuellen Knotens definiert ist):

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="library">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="book" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="isbn" type="xs:NMTOKEN"/>
                            <xs:element name="title" type="xs:string"/>
                            <xs:element name="character" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="name" type="xs:string"/>
                                        <xs:element name="qualification" type="xs:string"/>
                                    </xs:sequence>
                                    <xs:attribute name="id" type="xs:string"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                    <xs:key name="character">
                        <xs:selector xpath="character"/>
                        <xs:field xpath="@id"/>
                    </xs:key>
                </xs:element>
                <xs:element name="comment" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="about" type="xs:string"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="book">
            <xs:selector xpath="book"/>
            <xs:field xpath="isbn"/>
        </xs:unique>
        <xs:keyref name="comment" refer="character">
            <xs:selector xpath="comment"/>
            <xs:field xpath="@about"/>
        </xs:keyref>
    </xs:element>
</xs:schema>

Beispiel

<xs:element name="library">
    <xs:complexType>
        .../...
    </xs:complexType>
    <xs:key name="ID">
        <xs:selector xpath="book|author|character"/>
        <xs:field xpath="@id"/>
    </xs:key>
    <xs:keyref name="IDREF" refer="ID">
        <xs:selector xpath="book/author-ref|book/character-ref"/>
        <xs:field xpath="@ref"/>
    </xs:keyref>
</xs:element>

Attribute

id
Element-ID laut W3C XML Schema.

name
Name der Schlüssel-Referenz.

refer
Name des Schlüssels (bzw. der Eindeutigkeitsbedingung), auf den sich die Schlüssel-Referenz bezieht.

   

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