2010-03-18 25 views
13

क्या यह किसी भी तरह से संभव है, एक xsd योजना को परिभाषित करने के लिए जो xmlx xxx1 एक ही नाम के साथ कई तत्वों को परिभाषित कैसे करें, लेकिन xsd में अलग-अलग प्रकार: पसंद तत्व?

<item_list> 
    <item ItemType="SimpleMessage" Caption="Simplest message"/> 
    <item ItemType="ComplexMessage" SomeAttr="value"> 
    <item_data>some text</item_data> 
    </item> 
</item_list> 

समस्या यह है कि मुझे smth को परिभाषित करने की कोई संभावना नहीं है:

 <xsd:element name="Items"> 
     <xsd:complexType> 
     <xsd:choice> 
      <xsd:element name="item" type="SimpleMessType"/> 
      <xsd:element name="item" type="ComplexMessType"/> 
     </xsd:choice> 
     </xsd:complexType> 
    </xsd:element> 

लेकिन i जांचने की आवश्यकता है, कि SimpleMessage में कोई बाल तत्व या अतिरिक्त attrs नहीं है :(

उत्तर

0

आप इस स्कीमा वह संरचना आप प्रस्तावित का उपयोग कर ऐसा नहीं कर सकते है।

आपके लिए एक संभावित विकल्प एक सुपर-टाइप को परिभाषित करना है, BaseElement, जो खाली है, और फिर उप-प्रकार, और का उपयोग केवल सामान्य type विशेषता के बजाय ओवरराइड करने के लिए करें। यह कैसे काम करता है इस बारे में अधिक जानकारी here मिल सकती है।

5

एक्सएसडी स्पष्ट रूप से prohibits such a case। आपको तत्व नामों को अद्वितीय होने के लिए बदलना होगा (या xsi का उपयोग करें: टाइप करें xcut कहता है, जो एक ही चीज़ के बराबर है)।

एक के रूप में काम के आसपास, तुम प्रकार परिभाषाएं SimpleMessType और ComplexMessType एक ही प्रकार में के साथ विलय कर सकता है मिश्रित = "true" - और फिर सामग्री आप स्कीमा के बाद अपने कोड में प्राप्त सुलझाना प्रसंस्करण पूरा हो गया है। XSD schema for recursive XML के बारे में stackoverflow चर्चा देखें।

6

जैसा कि पहले के उत्तरों का पहले से ही उल्लेख किया गया है, आप एक ही कार्यक्षमता के साथ एक नया ItemType विशेषता परिभाषित करने के बजाय xsi:type विशेषता का उपयोग करके एक्सएसडी 1.0 में आसानी से पर्याप्त कर सकते हैं।

एक्सएसडी 1.1 में इस तरह के मामलों का समर्थन करना आसान बनाने के लिए डिज़ाइन किया गया एक निर्माण शामिल है, जो लोग किसी भी कारण से xsi:type का उपयोग नहीं करना चाहते हैं: सशर्त प्रकार असाइनमेंट। अनिवार्य रूप से यह एक तत्व घोषणा को XPath/typename जोड़े के सरल अनुक्रम की अनुमति देता है; XPath अभिव्यक्तियों का अनुक्रम में मूल्यांकन किया जाता है और जब कोई सत्य का मूल्यांकन करता है, तो तत्व संबंधित प्रकार से जुड़ा होता है। एक्सपीएथ पर तत्वों के वंशजों में आगे बढ़ने या एक्सएमएल दस्तावेज़ के अन्य हिस्सों में देखने या बाहर जाने पर प्रतिबंध लगाने के लिए प्रतिबंध हैं (पहली बार स्कैन एक स्टार्ट-टैग से मुकाबला करने में मदद करता है, जैसे कि टाइप करने के लिए किसी तत्व को प्रमाणित करने के लिए उपयोग करें; दूसरा सत्यापन संदर्भ मुक्त रखने में मदद करता है), इसलिए अनिवार्य रूप से परीक्षण केवल विशेषता मानों पर परीक्षण हो सकते हैं। आपका उदाहरण इस प्रकार लिखा जा सकता है:

<xs:element name="item"> 
    <xs:alternative test="@ItemType='SimpleMessage'" type="SimpleMessType"/> 
    <xs:alternative test="@ItemType='SimpleMessage'" type="ComplexMessType"/> 
    <xs:alternative type="xs:error"/> 
</xs:element> 

तीसरे विकल्प सुनिश्चित करता है कि आपके उम्मीद मामलों में से एक का सामना करना पड़ा जाना चाहिए, तत्व के लिए वैध था। यदि इसे यहां छोड़ा गया था, तो यदि परीक्षण अभिव्यक्तियों में से कोई भी सत्य नहीं था, तो इस मामले में xs:anyType में तत्व घोषित प्रकार item असाइन किया जाएगा।

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