मैं एक्सएस: कुंजी और एक्सएस: कीफ परिभाषाओं का उपयोग कर एक्सएमएल स्कीमा पर कुछ विदेशी कुंजी बाधाओं को परिभाषित करने की कोशिश कर रहा हूं। मैं दस्तावेज़ की संरचना निम्नलिखित तरीके से श्रेणीबद्ध होना चाहते हैं:एक्सएसडी कुंजी/कीफ्रफ़: पदानुक्रमित कुंजी संरचना
<?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>
एक हर माता-पिता एक (विश्व स्तर पर) अद्वितीय कुंजी, parentKey द्वारा परिभाषित किया गया है। प्रत्येक बच्चे की चाबी बच्चे, द्वारा परिभाषित की गई है लेकिन बालकी केवल अपने माता-पिता के दायरे में अद्वितीय है।
तब किसी विशेष माता-पिता और बच्चे के विदेशी कुंजी संदर्भों के साथ संदर्भकर्ताओं की एक सूची है।
मैं जितनी चाहें चाबियाँ परिभाषित करने में सक्षम हूं, बस उन्हें सही तत्व पर डालकर: मूल तत्व पर पैरेंटकी बाधा, और मूल तत्व पर बच्चे की बाधा। मैं बिना किसी कठिनाई के माता-पिता को keyref परिभाषित कर सकता हूं।
बच्चे के लिए एक keyref परिभाषित करने की कोशिश करते समय समस्या उत्पन्न होती है। मैंने रूट तत्व पर मूल तत्व पर एक साधारण कीफ को परिभाषित करने का प्रयास किया, लेकिन यह काम नहीं करता है क्योंकि मुझे उचित अभिभावक उप-धारा के तहत केवल बाल तत्वों का चयन करने का कोई तरीका नहीं दिखता है। (ग्रहण सत्यापनकर्ता, कम से कम, हमेशा दस्तावेज़ में अंतिम अभिभावक उप-सामग्री की सामग्री के विरुद्ध मान्य करता है ...)।
मैं तो एक समग्र कुंजी (रूट पर) को परिभाषित करने, साथ करने की कोशिश की:
- चयनकर्ता = माता पिता
- क्षेत्र = @parentKey
- क्षेत्र = बच्चे/@ childKey
यह माता-पिता के तहत परिभाषित एक से अधिक बच्चे होने पर विफल रहता है। XSD 1.1 spec, सेक्शन 3.11.4, आइटम 3 के आधार पर यह सही व्यवहार है, जिसमें कहा गया है कि कुंजी को फ़ील्ड परिभाषा के अधिकांश एक नोड पर मिलान करना है।
बस दोहराने के लिए: यदि मैं बच्चों को विश्व स्तर पर अनूठा होने के लिए मजबूर करता हूं, तो इसे कार्यान्वित करना आसान है; कठिनाई स्थानीय रूप से अद्वितीय बाल के संदर्भ में संदर्भित है।
किसी भी एक्सएसडी स्वामी के पास कोई विचार है?
संदर्भ के लिए, एक असफल childKey keyref बाहर टिप्पणी की के साथ एक नमूना XSD है,:
<?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>
हाय एरन, तो आप इस समस्या के लिए समाधान खोजने के किया? मैं भी इसी तरह की समस्या से फंस गया हूं। (मैं अपना एक्सएमएल बदल नहीं सकता)। – Rahul
मुझे डर नहीं है - हम डेटा इंटरचेंज के लिए एक गैर-एक्सएमएल प्रारूप में आगे बढ़े, प्रश्नोत्तरी प्रस्तुत करते हुए। – Aron