Próbuję zdefiniować niektóre ograniczenia klucza obcego w schemacie XML za pomocą definicji xs: key i xs: keyref. Chcę struktura dokumentu być hierarchiczna w następujący sposób:Klucz/klucz XSD: hierarchiczna struktura klucza
<?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>
każdy rodzic ma (globalnie) unikatowy klucz, zdefiniowane przez parentKey. Każde dziecko ma klucz zdefiniowany przez childKey, , ale childKey jest tylko unikalny w zakresie swojego rodzica zawierającego.
Istnieje lista polecających z kluczami obcymi do konkretnego rodzica i dziecka.
Jestem w stanie zdefiniować klucze, jak chcę, po prostu umieszczając je na właściwym elemencie: ograniczenie parentKey na element główny i ograniczenie childKey na elemencie nadrzędnym. Mogę również bezbłędnie zdefiniować keyref do parentKey.
Problemy pojawiają się podczas próby zdefiniowania elementu keyref na childKey. Próbowałem zdefiniować prosty keyref na głównym elemencie do childKey, ale to nie działa, ponieważ nie widzę sposobu, aby wybrać tylko elementy podrzędne w odpowiednim nadrzędnym poddrzewie. (Przynajmniej weryfikator Eclipse zawsze po prostu sprawdza poprawność w stosunku do zawartości poddrzewa nadrzędnego w dokumencie ...).
Następnie próbowałem definiowania klucza kompozytowego (na root), z:
- selektor = nadrzędnej
- pole = @parentKey
- pole = dziecko/@ childKey
ten kończy się niepowodzeniem, jeśli zdefiniowano więcej niż jedno dziecko pod rodzicem. Jest to poprawne zachowanie oparte na XSD 1.1 spec, sekcja 3.11.4, pozycja 3, która stwierdza, że klucz musi pasować co najwyżej do jednego węzła na definicję pola.
Tylko powtórzyć: jeśli zmusić ChildKeys do globalnej unikalności, jest to łatwe do wdrożenia; trudność polega na odwoływaniu się do lokalnie unikalnych childKeys.
Każdy mistrz XSD ma pomysł?
Dla porównania, oto próbka XSD, z nieudanej childKey keyref wykomentowane:
<?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, znaleźliście rozwiązanie tego problemu? Utknąłem z podobnym problemem (nie mogę zmienić mojego xml). – Rahul
Obawiam się, że nie - skończyło się przejściem do formatu XML na wymianę danych, co spowodowało dyskusję. – Aron