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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie etwa bezogen auf die Eltern von dem Kind? Auch wenn viele Kinder, es wird nur noch ein Elternteil, und die Kombination der (Elternteil,Kind) schafft einen Global eindeutigen Schlüssel, auch wenn der untergeordnete Schlüssel ist nur einmalig innerhalb von übergeordneten
Dies funktioniert nicht xmllint, auch wenn die Skillung scheint nicht explizit verbieten dies für die Felder - nur für Selektoren: 3.11.4, (2) sagt der selector nicht ein Vorfahre (es kann nur der Kontext-node oder Nachkommen.)
Ah, hier ist der Nagel in den Sarg (Blick auf spezifische syntax): die XPath-Ausdrücke dürfen, sind sehr begrenzt und einfach nicht der ".." http://www.w3.org/TR/xmlschema-1/#c-fields-xpaths
So, sorry, das beantwortet nicht deine Frage, aber vielleicht wird es Ihnen einige Ideen.
Eine hässliche Lösung ändern Sie Ihre XML-format, so dass die parentKey enthalten ist, in jedes Kind, wie diese:
Ich denke, deine situation ist sehr legitim, und ich würde erwarten, dass es einen Weg gibt, dies zu tun - warum nicht versuchen, die xml-dev-mailing-Liste? Es werden laut zuletzt habe ich geprüft, aber einige von den Machern von xml wurden noch hängen draußen.
Hatte ich eine ähnliche Frage: XML-Schema Schlüssel mit mehreren Feldern
Habe ich beschlossen, dass der beste Ansatz für mich war die Reihenfolge der XML zu ermöglichen, die für den Anwendungsbereich bestimmt werden, durch die Ortschaft statt der Durchsetzung einer key mit zwei Feldern.
In Ihrem Szenario, wenn Sie sich bewegen, die referrer-innen der Eltern, dies wird es ermöglichen, die Reichweite und verweisen auf das entsprechende Kind. Sie hätte dann die referrer-element beziehen sich auf den äußeren Rahmen um das element, das es braucht, um Referenz.
Es ist ein wenig schwer zu bestimmen, ob dies ist eine akzeptable Lösung, weil dein problem scheint zu sein, ein wenig abstrahiert. In meinem problem beschrieben in meiner Frage, ich war den Umgang mit Fragen, Antworten und user Antworten. Ich ursprünglich versucht hatte, Sie zu validieren, wenn ein Benutzer die Antwort war eigentlich eine gültige Antwort; mein Erster Ansatz involviert eine gleiche Technik, die Sie verwenden. Meine endgültige Lösung handelte sich darum, die Antwort in die Frage, und dann bezogen auf die user.
Meine XML VOR:
Meine XML NACH: