2009-05-21 11 views
13

मैं एक्सएस: कुंजी और एक्सएस: कीफ परिभाषाओं का उपयोग कर एक्सएमएल स्कीमा पर कुछ विदेशी कुंजी बाधाओं को परिभाषित करने की कोशिश कर रहा हूं। मैं दस्तावेज़ की संरचना निम्नलिखित तरीके से श्रेणीबद्ध होना चाहते हैं:एक्सएसडी कुंजी/कीफ्रफ़: पदानुक्रमित कुंजी संरचना

<?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> 
+1

हाय एरन, तो आप इस समस्या के लिए समाधान खोजने के किया? मैं भी इसी तरह की समस्या से फंस गया हूं। (मैं अपना एक्सएमएल बदल नहीं सकता)। – Rahul

+1

मुझे डर नहीं है - हम डेटा इंटरचेंज के लिए एक गैर-एक्सएमएल प्रारूप में आगे बढ़े, प्रश्नोत्तरी प्रस्तुत करते हुए। – Aron

उत्तर

2

कैसे बच्चे से माता-पिता की बात कर के बारे में? यहां तक ​​कि कई बच्चों अगर, वहाँ एक ही माता पिता हो जाएगा, और (माता पिता, बच्चे) के संयोजन एक विश्व स्तर पर अद्वितीय कुंजी बनाता है, भले ही बच्चे कुंजी अपनी मूल के भीतर ही अद्वितीय है:

<key name="childKeyDef"> 
    <selector xpath="child"/> 
    <field xpath="@childKey"/> 
    <field xpath="../@parentKey"/> 
    </key> 

यह काम नहीं करता xmllint में, भले ही यह स्पष्ट रूप से फ़ील्ड के लिए इसे अस्वीकार नहीं करता है - केवल चयनकर्ताओं के लिए: 3.11.4, (2) कहते हैं कि चयनकर्ता पूर्वजों नहीं हो सकता है (यह केवल संदर्भ नोड या वंशज हो सकता है।)

आह, यहां ताबूत में नाखून है (विशिष्ट वाक्यविन्यास को देखकर): XPath अभिव्यक्तियों की अनुमति बहुत सीमित है, और बस इसमें शामिल नहीं है ".."http://www.w3.org/TR/xmlschema-1/#c-fields-xpaths

तो, माफ करना, यह आपके सवाल का जवाब नहीं है, लेकिन शायद यह आप कुछ विचार दे देंगे। ताकि parentKey प्रत्येक बच्चे में शामिल है

+1

हाँ; मैंने खुद को कोशिश की थी और चयनकर्ता और क्षेत्र xpath अभिव्यक्तियों पर सख्त सीमाओं के बारे में एक ही खोज की थी। सिद्धांत में अच्छा विचार, यद्यपि। प्रयासों के लिए धन्यवाद! – Aron

+0

मुझे लगता है कि इस बाधा के संयोजन में, आपको मिली दूसरी बाधा के साथ (एक xpath के लिए केवल एक नोड को संदर्भित करने के लिए), एक सबूत है कि आप जो करना चाहते हैं वह एक्सएसडी में असंभव है - मैं सबूत शर्त लगाता हूं (यदि वहां है एक है) बहुत आसान है, लेकिन मैं इसे काफी नहीं देख सकता। – 13ren

1

एक बदसूरत समाधान, अपने XML स्वरूप बदलने के लिए है , इस तरह:?

<parent> 
    <child parentKey="parent1" childKey="child1"/> 
    <child parentKey="parent1" childKey="child2"/> 
</parent> 

मुझे लगता है कि अपनी स्थिति बहुत वैध है, और मैं वहाँ उम्मीद यह करने के लिए एक तरह से होना करने के लिए चाहते हैं - क्यों एक्सएमएल-देव मेलिंग सूची की कोशिश मत यह शोर पिछले मैं जाँच की बन गया है, लेकिन एक्सएमएल के कुछ निर्माता अभी भी वहां लटक रहे थे।

+0

हाँ, यह एक संभावना होगी, लेकिन मुझे लगता है कि इससे हल होने की तुलना में अधिक समस्याएं होती हैं ... जैसा कि आप कहते हैं, बदसूरत। मेरा डिज़ाइन बाहरी कारणों से इस संरचना से दूर हो गया है, इसलिए इस बिंदु पर यह एक अकादमिक अभ्यास है, लेकिन शायद मैं सूची को आज़मा दूंगा। विचार के लिए धन्यवाद! – Aron

0

मेरे पास एक समान प्रश्न था: XML Schema Key with multiple fields

मैंने फैसला किया कि मेरे लिए सबसे अच्छा तरीका एक्सएमएल को फिर से व्यवस्थित करना था ताकि क्षेत्र को दो क्षेत्रों के साथ कुंजी लागू करने के बजाय इलाके द्वारा निर्धारित किया जा सके।

अपने परिदृश्य में, यदि आप माता-पिता के अंदर रेफरर ले जाते हैं, तो यह उचित बच्चे को संदर्भित करने के लिए दायरे को सेट करने की अनुमति देगा। इसके बाद आप रेफरर तत्व को उस तत्व के बाहरी दायरे को संदर्भित करेंगे जिसे संदर्भित करने की आवश्यकता है।

यह निर्धारित करने में थोड़ा मुश्किल है कि यह एक स्वीकार्य समाधान है क्योंकि आपकी समस्या थोड़ा सा सारणी प्रतीत होती है। मेरी समस्या में, मेरे प्रश्न में वर्णित, मैं प्रश्न, उत्तर और उपयोगकर्ता प्रतिक्रियाओं से निपट रहा था। मैं मूल रूप से सत्यापित करने की कोशिश कर रहा था कि क्या उपयोगकर्ता की प्रतिक्रिया वास्तव में एक वैध उत्तर थी; मेरा पहला दृष्टिकोण एक ही तकनीक शामिल है जिसका आप उपयोग कर रहे हैं। मेरा अंतिम समाधान प्रश्न के अंदर प्रतिक्रिया को आगे बढ़ाने में शामिल था, और फिर उपयोगकर्ता का जिक्र करता था।

से पहले अपने एक्सएमएल:

<?xml version="1.0" encoding="utf-8"?> 
<survey> 
    <user id="bob"> 
    <response questionIdRef="q101">yes</response> 
    <response questionIdRef="q102">white</response> 
    </user> 
    <user id="jane"> 
    <response questionIdRef="q101">no</response> 
    <response questionIdRef="q102">blue</response> 
    </user> 
    <question id="q101"> 
    <text>Do you like the color red?</text> 
    <answer>yes</answer> 
    <answer>no</answer> 
    </question> 
    <question id="q102"> 
    <text>What is your favorite color?</text> 
    <answer>red</answer> 
    <answer>blue</answer> 
    <answer>white</answer> 
    <answer>yellow</answer> 
    </question> 
</survey> 

मेरे एक्सएमएल के बाद:

<?xml version="1.0" encoding="utf-8"?> 
<survey> 
    <user id="bob" /> 
    <user id="jane" /> 
    <question id="q101"> 
    <text>Do you like the color red?</text> 
    <answer>yes</answer> 
    <answer>no</answer> 
    <response userIdRef="bob">yes</response> 
    <response userIdRef="jane">no</response> 
    </question> 
    <question id="q102"> 
    <text>What is your favorite color?</text> 
    <answer>red</answer> 
    <answer>blue</answer> 
    <answer>white</answer> 
    <answer>yellow</answer> 
    <response userIdRef="bob">white</response> 
    <response userIdRef="jane">blue</response> 
    </question> 
</survey> 
संबंधित मुद्दे