XSD-key/keyref: hierarchisches key-Struktur

Ich versuche zu definieren, einige von foreign key-Einschränkungen auf einem XML-schema über xs:key und xs:keyref-Definitionen. Ich möchte die Struktur der Dokumente werden hierarchisch in folgender Weise:

<?xml version="1.0" encoding="UTF-8"?>
<tns:root xmlns:tns="http://www.example.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/SampleSchema.xsd ">
  <parent parentKey="parent1">
    <child childKey="child1"/>
    <child childKey="child2"/>
  </parent>
  <parent parentKey="parent2">
    <child childKey="child1"/>
    <child childKey="child2"/>
  </parent>
  <referrer parentRef="parent1" childRef="child2"/>
</tns:root>

Jedes Elternteil hat einen (Global) eindeutigen Schlüssel definiert durch parentKey. Jedes Kind hat Schlüssel definiert durch childKey, aber childKey ist nur eindeutig innerhalb des Umfangs der mit übergeordneten.

Dort ist dann eine Liste der Verweise mit foreign-key-Referenzen auf ein bestimmtes Elternteil und Kind.

Ich bin in der Lage zu definieren, die Tasten so, wie ich will, einfach, indem Sie Sie auf das richtige element: die parentKey Einschränkung auf das root-element, und die childKey Einschränkung auf das übergeordnete element. Ich kann auch definieren, die keyref zu parentKey ohne Schwierigkeiten.

Die Probleme, die entstehen, wenn Sie versuchen zu definieren keyref zu childKey. Ich habe versucht die Definition eines einfachen keyref auf das root-element zu childKey, aber das funktioniert nicht, da sehe ich keine Möglichkeit, wählen Sie nur die untergeordneten Elemente unter den passenden Eltern Teilbaum. (Das Eclipse-validator, mindestens, immer einfach überprüft, gegen den Inhalt der letzten übergeordnete Teilstruktur in dem Dokument,...).

Dann habe ich versucht, die Definition einer zusammengesetzten Schlüssel (auf root), mit:

  • selector = parent
  • Feld = @parentKey
  • Feld = Kind/@childKey

Dieser schlägt fehl, wenn mehr als ein Kind im Sinne der Eltern. Das ist das richtige Verhalten auf der Grundlage der XSD 1.1 Spezifikation, Abschnitt 3.11.4, Ziffer 3, der besagt, dass der Schlüssel passen auf die meisten ein-Knoten-pro-Feld-definition.

Nur zu wiederholen: wenn ich Kraft childKeys Global eindeutig sein, dies ist einfach zu implementieren; die Schwierigkeit ist rund um die Referenzierung lokal einzigartige childKeys.

Alle XSD-Meister da draußen eine Idee?

Zur Referenz hier ist ein Beispiel-XSD, mit einer ausgefallenen childKey keyref auskommentiert:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/" xmlns:tns="http://www.example.org/" elementFormDefault="unqualified">

    <element name="root">
        <complexType>
            <sequence>
                <element name="parent" maxOccurs="unbounded" minOccurs="1">
                    <complexType>
                        <sequence>
                            <element name="child" maxOccurs="unbounded" minOccurs="1">
                                <complexType>
                                    <attribute name="childKey" type="string" use="required"/>
                                </complexType>
                            </element>
                        </sequence>
                        <attribute name="parentKey" type="string" use="required"/>
                    </complexType>
                    <key name="childKeyDef">
                        <selector xpath="child"/>
                        <field xpath="@childKey"/>
                    </key>
                </element>
                <element name="referrer" maxOccurs="unbounded" minOccurs="1">
                    <complexType>
                        <attribute name="parentRef" type="string"/>
                        <attribute name="childRef" type="string"/>
                    </complexType>
                </element>
            </sequence>
        </complexType>
        <key name="parentKeyDef">
            <selector xpath="parent"/>
            <field xpath="@parentKey"/>
        </key>
        <keyref name="parentKeyRef" refer="tns:parentKeyDef">
            <selector xpath="referrers"/>
            <field xpath="@parentRef"/>
        </keyref>
<!--        <keyref name="childKeyRef" refer="tns:childKeyDef">-->
<!--            <selector xpath="referrers"/>-->
<!--            <field xpath="@childRef"/>-->
<!--        </keyref>-->
    </element>
</schema>
  • Hi Aron , Hast du die Lösung für dieses problem? Ich bin auch stuck mit ähnlichen problem.(Kann ich nicht ändern, meine xml).
  • Ich fürchte nicht - beendeten wir den übergang zu einer nicht-XML-format zum Datenaustausch, wodurch die Frage irrelevant.
InformationsquelleAutor Aron | 2009-05-21
Schreibe einen Kommentar