2010-04-22 18 views
15

तत्वों के अनुक्रम को अनदेखा करने के लिए मैं अपने xsd को कैसे डिज़ाइन कर सकता हूं?xs का उपयोग कर तत्वों का क्रम अनदेखा करें: एक्सटेंशन

<root> <a/> <b/> </root> 

<root> <b/> <a/> </root> 

मैं कोड पीढ़ी कारणों के लिए extension उपयोग करने की आवश्यकता है, इसलिए मैं निम्नलिखित का उपयोग कर all की कोशिश की:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://www.example.com/test" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:t="http://www.example.com/test" > 

    <xs:complexType name="BaseType"> 
     <xs:all> 
      <xs:element name="a" type="xs:string" /> 
     </xs:all> 
    </xs:complexType> 

    <xs:complexType name="ExtendedType"> 
     <xs:complexContent> 
      <xs:extension base="t:BaseType"> 
       <xs:all> <!-- ERROR --> 
        <xs:element name="b" type="xs:string" /> 
       </xs:all> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:element name="root" type="t:ExtendedType"></xs:element> 
</xs:schema> 

यह XSD मान्य नहीं है हालांकि, वें ई निम्न त्रुटि <!-- ERROR --> में रिपोर्ट किया गया है:

क्योंकि सभी-limited.1.2: साथ {न्यूनतम होती है} = {अधिकतम होता है} = 1 एक सभी मॉडल समूह एक कण में दिखाया जाना चाहिए, और है कि कण हिस्सा होना चाहिए एक जोड़ी का एक जटिल प्रकार परिभाषा के {सामग्री प्रकार} का गठन करता है।

cos-all-limited.1.2 का प्रलेखन कहते हैं:

1,2 {अवधि} {अधिकतम होता है} = 1 जो एक जोड़ी का हिस्सा है के साथ एक कण की संपत्ति है जो एक जटिल प्रकार की {} सामग्री प्रकार का गठन किया परिभाषा।

मैं सच में समझ में नहीं आता इस (न XSD है और न ही अंग्रेजी देशी वक्ता :))।


क्या मैं गलत काम कर रहा हूं, क्या मैं सही काम कर रहा हूं, या क्या इसे हासिल करने का कोई तरीका नहीं है?

उत्तर

6

प्रमुख संपादन मूल रूप से मुझे xsd:extension का उपयोग करने की आवश्यकता को याद किया गया। ध्यान दें कि xsd:extension काम करता है जैसे xsd:sequence आधार प्रकार की सामग्री के साथ विस्तारित प्रकार की सामग्री के साथ। XML स्कीमा प्राइमर का कहना है:

जटिल प्रकार विस्तार से ली गई है जब, इसके प्रभावी सामग्री मॉडल आधार प्रकार और सामग्री मॉडल प्रकार व्युत्पत्ति में निर्दिष्ट की सामग्री के मॉडल है। इसके अलावा, दो सामग्री मॉडल को अनुक्रमिक समूह के दो बच्चों के रूप में माना जाता है।

इसलिए, ऐसा लगता है कि इस काम को बनाने का एकमात्र तरीका एक खाली आधार प्रकार है और पूरे विकल्प को विस्तारित प्रकार, या इसके विपरीत (आधार और खाली विस्तार में सब कुछ) में स्टोर करना है।इस तरह:

<xsd:complexType name="ExtendedType"> 
    <xsd:complexContent> 
     <xsd:extension base="BaseType"> 
     <xsd:choice> 
      <xsd:sequence> 
       <xsd:element name="a" type="xsd:string"/> 
       <xsd:element name="b" type="xsd:string"/> 
      </xsd:sequence> 
      <xsd:sequence> 
       <xsd:element name="b" type="xsd:string"/> 
       <xsd:element name="a" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:choice> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

<xsd:complexType name="BaseType"/> 

<xsd:element name="root" type="ExtendedType"/> 
+0

@Peter ठीक है, मुझे लगता है कि हिस्सा याद किया। यहां एक अपडेट है। – Bolo

+0

आपके अपडेट के लिए धन्यवाद। दुर्भाग्यवश मुझे बेस प्रकार में कुछ तत्वों को परिभाषित करने की आवश्यकता है, और कुछ विस्तारित हैं, इसलिए जब तक कोई दूसरा तरीका न हो, विस्तारित प्रकार के तत्वों को हमेशा बेस प्रकार के तत्वों के बाद रखा जाना चाहिए ... –

+0

@ पीटर उस स्थिति में, चूंकि "दो सामग्री मॉडल अनुक्रमिक समूह के दो बच्चों के रूप में माना जाता है", अनुक्रम को अनदेखा करने के लिए कोई रास्ता नहीं है (जहां तक ​​मैं देख सकता हूं)। – Bolo

-3

<xs:complexType name="BaseType"> 
    <xs:sequence> 
     <xs:element name="a" type="xs:string" /> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="ExtendedType"> 
    <xs:complexContent> 
     <xs:extension base="t:BaseType"> 
      <xs:sequence> 
       <xs:element name="b" type="xs:string" /> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="root" type="t:ExtendedType"></xs:element> 

+0

@ रूसलान: क्या आपने यह कोशिश की है? यह 'बी' से पहले' ए' के अनुक्रम को लागू करेगा, इसलिए यह वास्तव में मेरी मदद नहीं करता है ... –

6

यहाँ प्रतिबंध की व्याख्या है: http://marc.info/?l=xerces-j-user&m=118712527901786&w=4

केवल विस्तार आप के साथ जटिल प्रकार के लिए कर सकते एक "सभी" मॉडल कुछ विशेषताओं को जोड़ना है। आप नए तत्वों के साथ विस्तार नहीं कर सकते हैं।

मेरे मामले में मैं ऐसा ही कुछ किया है:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://www.example.com/test" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:t="http://www.example.com/test" > 

    <xs:complexType name="BaseType"> 
     <xs:all> 
      <xs:element name="a" type="xs:string" /> 
     </xs:all> 
    </xs:complexType> 

    <xs:complexType name="ExtendedType"> 
     <xs:all> 
      <xs:element name="a" type="xs:string" /> <!-- copy/paste from BaseType --> 
      <xs:element name="b" type="xs:string" /> 
     </xs:all> 
    </xs:complexType> 

    <xs:element name="root" type="t:ExtendedType"></xs:element> 
</xs:schema> 
संबंधित मुद्दे