2012-04-27 20 views
10

मैं एक XML दस्तावेज क्यू & के रूप में संरचित है भाई तत्वों की विशेषता पर अद्वितीय बाधा एक जो इस प्रारूप इस प्रकार है (स्पष्टता के लिए संपादित):XSD एक विशिष्ट प्रकार

<question> 
    <answer id="1"> 
     <question> 
      <answer id="1"/> 
      <answer id="2"/> 
      <answer id="3"/> 
     </question> 
    </answer> 
    <answer id="2"> 
     <question> 
      <answer id="1"/> 
      <answer id="2"/> 
     </question> 
    </answer> 
</question> 

मेरे XSD इस तरह दिखता है:

<xs:element name="question"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="answer" type="answerType" minOccurs="2" maxOccurs="unbounded"> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="AnswerIdUnique"> 
     <xs:selector xpath="./*" /> 
     <xs:field xpath="@id" /> 
    </xs:unique> 
</xs:element> 

<xs:complexType name="answerType"> 
    <xs:sequence> 
     <xs:element ref="question" minOccurs="0" maxOccurs="1" /> 
    </xs:sequence> 
    <xs:attribute name="id" type="xs:token" use="required" /> 
</xs:complexType> 

निश्चित रूप से, जो आप ऊपर देखते हैं उससे अधिक है, लेकिन यह मेरी समस्या को दर्शाता है। मुझे id विशेषता answer तत्वों के लिए भाई बहनों के बीच अद्वितीय होने की आवश्यकता है। उपरोक्त परिभाषित एक्सएसडी id की विशिष्टता को भाई तत्वों के बीच गुणों को लागू करता है, लेकिन यह तत्व प्रकार पर भेदभाव नहीं करता है। मैंने अद्वितीय बाधाओं में विभिन्न चयनकर्ताओं और क्षेत्रों की कोशिश की है, लेकिन काम करने वाले संयोजन को नहीं मिला है। कोई सुझाव?

उत्तर

14

बस चयनकर्ता को <xs:selector xpath="answer"/> पर बदलें और आप ठीक होंगे। आम तौर पर केवल प्रदर्शन कारणों से XP12s को .//* से बचाना अच्छा होता है।

यह मुझे लगता है कि जिस तरह से आप चाहते हैं काम कर रहा है आपके द्वारा दिए गए एक्सएमएल नमूना के लिए XML स्कीमा है:

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="question" type="questionType"> 
     <xs:unique name="AnswerIdUnique"> 
      <xs:selector xpath="answer"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
    </xs:element> 
    <xs:complexType name="questionType"> 
     <xs:sequence> 
      <xs:element name="answer" type="answerType" minOccurs="2" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="answerType"> 
     <xs:sequence> 
      <xs:element ref="question" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
     <xs:attribute name="id" type="xs:token" use="required"/> 
    </xs:complexType> 
</xs:schema> 

आपके द्वारा प्रेषित एक्सएमएल ऊपर के साथ ठीक सत्यापित करता है; किसी भी भाई उत्तर की आईडी को डुप्लिकेट करना एक सत्यापन त्रुटि उत्पन्न करता है। उदाहरण के लिए, निम्न XML:

<question> 
    <answer id="1"> 
     <question> 
      <answer id="1"/> 
      <answer id="2"/> 
      <answer id="1"/> 
     </question> 
    </answer> 
    <answer id="1"> 
     <question> 
      <answer id="1"/> 
      <answer id="2"/> 
     </question> 
    </answer> 
</question> 

जब मान्य (QTAssistant में, दृश्य स्टूडियो के बाद से यह एक ही तकनीक पर आधारित है में संदेश के समान होना चाहिए), इन त्रुटियों हैं:

Error occurred while loading [], line 6 position 5 
There is a duplicate key sequence '1' for the 'AnswerIdUnique' key or unique identity constraint. 
Error occurred while loading [], line 9 position 3 
There is a duplicate key sequence '1' for the 'AnswerIdUnique' key or unique identity constraint. 
Document1.xml is invalid. 

नीचे विजुअल स्टूडियो 2010 का एक स्क्रीनशॉट है जो मैंने पोस्ट किए गए एक्सएसडी के खिलाफ उपरोक्त XML सत्यापन दिखा रहा है; जबकि समस्याओं को अनजाने में चेतावनियों के रूप में रिपोर्ट किया जाता है, फिर भी, वे रिपोर्ट किए जाते हैं।

VS2010 showing unique constraint errors

मैं बेतरतीब ढंग से एक ऑनलाइन सत्यापनकर्ता (http://xsdvalidation.utilities-online.info/) उठाया और एक ही एक्सएमएल और XSD मैं पोस्ट किया है मान्य कर दिया है; त्रुटि के रूप में रिपोर्ट किया गया है:

org.xml.sax.SAXParseException: Duplicate unique value [1] declared for identity constraint of element "question".org.xml.sax.SAXParseException: Duplicate unique value [1] declared for identity constraint of element "question".

एक बात आप पर ध्यान देना है तो आप अपने XSD के लिए एक लक्ष्य नाम स्थान है जब; उस स्थिति में, सभी शामिल नामस्थानों के लिए उपनाम परिभाषित करने की आवश्यकता है, और अपने चयनकर्ताओं में उनका उपयोग करें।

अद्यतन: और नामस्थान के साथ XSD:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://localhost" xmlns="http://localhost" targetNamespace="http://localhost" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="question" type="questionType"> 
     <xs:unique name="AnswerIdUnique"> 
      <xs:selector xpath="tns:answer"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
    </xs:element> 
    <xs:complexType name="questionType"> 
     <xs:sequence> 
      <xs:element name="answer" type="answerType" minOccurs="2" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="answerType"> 
     <xs:sequence> 
      <xs:element ref="question" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
     <xs:attribute name="id" type="xs:token" use="required"/> 
    </xs:complexType> 
</xs:schema> 

tns उपसर्ग की शुरूआत और चयनकर्ता में इसका इस्तेमाल नोटिस करें।

+0

यह किसी कारण से काम नहीं करता है। कृपया मेरा अद्यतन प्रश्न – joelmdev

+0

देखें यदि मुझे पता था कि यह क्यों काम नहीं करता है, तो मैं इस सवाल को पहले स्थान पर पोस्ट नहीं करूँगा, इस प्रकार किसी कारण से बयान यह काम नहीं करता है। मैं वीएस -2010 का उपयोग कर रहा हूं और ऐसा लगता है कि xpath चयनकर्ता में "उत्तर" युक्त प्रत्येक संस्करण काम करने से इंकार कर देता है। उत्तर टाइप से अद्वितीय कॉन्स्टेंट को हटाने और रेफरी = "प्रश्न" जोड़ने से एक अस्पष्ट त्रुटि हुई जो कि "द रेफरी" विशेषता मौजूद नहीं हो सकती है।"संपादन काम करने के लिए जितना करीब है, उतना करीब है। कृपया अपना एक्सएसडी पोस्ट करें और मैं स्थानीय रूप से कोशिश करूंगा। मेरे साथ असर के लिए धन्यवाद- यह वर्षों से है क्योंकि मुझे एक्सएमएल स्कीमा दस्तावेज़ लिखना पड़ा है और मैं जंगली हूं। – joelmdev

+0

पेट्रू, आप एक्सएमएल के साथ काम करने के लिए किस सॉफ्टवेयर का उपयोग कर रहे हैं और इसे स्कीमा के खिलाफ मान्य कर सकते हैं? – joelmdev

संबंधित मुद्दे