2008-09-19 15 views
18

मैं "अनुक्रम" की तरह एक स्कीमा का हिस्सा स्थापित करने की कोशिश कर रहा हूं जहां सभी बच्चे तत्व वैकल्पिक हैं, लेकिन कम से कम एक तत्वों का उपस्थित होना चाहिए, और उनमें से एक से अधिक हो सकता है।"इनमें से किसी एक या अधिक तत्वों के लिए एक्सएमएल स्कीमा निर्माण, लेकिन कम से कम एक होना चाहिए"

मैं निम्नलिखित कर रही कोशिश की, लेकिन XMLSpy शिकायत है कि DateConstant "> और < तत्व नाम =" DateConstant "सामग्री मॉडल तत्वों < तत्व नाम = में" "> जो विशिष्ट रूप से निर्धारित नहीं किया जा सकता है।":

<xs:choice> 
     <xs:sequence> 
      <xs:element name="DateConstant"/> 
      <xs:element name="TimeConstant"/> 
     </xs:sequence> 
     <xs:element name="DateConstant"/> 
     <xs:element name="TimeConstant"/> 
    </xs:choice> 

क्या यह किया जा सकता है (और यदि ऐसा है, तो कैसे)?

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

उत्तर

21

इस प्रयास करें:

<xs:choice> 
    <xs:sequence> 
    <xs:element name="Elem1" /> 
    <xs:element name="Elem2" minOccurs="0" /> 
    <xs:element name="Elem3" minOccurs="0" /> 
    </xs:sequence> 
    <xs:sequence> 
    <xs:element name="Elem2" /> 
    <xs:element name="Elem3" minOccurs="0" /> 
    </xs:sequence> 
    <xs:element name="Elem3" /> 
</xs:choice> 

ऐसा करने से, आप पहले तत्व का चयन करने के लिए या तो मजबूर और फिर बाकी वैकल्पिक है, या तो दूसरा तत्व और बाकी वैकल्पिक, या तो तीसरा तत्व है।

यह वही करना चाहिए जो आप चाहते हैं, मुझे उम्मीद है।

बेशक, यदि आप महसूस करते हैं कि आप किसी को याद करते हैं तो आप प्रत्येक अनुक्रम में तत्व को डुप्लिकेट करने से बचने के लिए उप-अनुक्रमों को समूह में रख सकते हैं।

13

MSDN पर तकनीकी लेख के अनुसार समझ XML स्कीमा शीर्षक http://msdn.microsoft.com/en-us/library/aa468557.aspx#understandxsd_topic5 पर आप इस तरह के विकल्प परिभाषा पर minOccurs (कंपोज़िटर) खुद के रूप में की कमी का लाभ ले सकते:

"का उपयोग घटना की कमी एक कंपोजिटर पर पूरे समूह पर पूरी तरह से लागू होता है "

(अधिक परिष्कृत उदाहरण देखें जो नेस्टेड जटिल प्रकारों और लेखक प्रकार उदाहरण का उपयोग करता है)

आपने अपनी आवश्यकता बताई है कि "तत्वों में से कम से कम एक उपस्थित होना चाहिए, और उनमें से एक से अधिक हो सकता है"। इस प्रकार, मेरा प्रस्ताव है कि आप निम्न प्रयास करें:

<xs:choice minOccurs="1" maxOccurs="unbounded"> 
    <xs:element name="DateConstant" type="..."/> 
    <xs:element name="TimeConstant" type="..."/> 
</xs:choice> 
+0

यह काम नहीं करता है। यदि एक तत्व अनुपस्थित है, जबकि एक मौजूद है, तो कोई त्रुटि नहीं होगी। – yegor256

1

@hurst,

दुर्भाग्य से आप मूल प्रश्न को समझने के लिए विफल रहे हैं। पसंद पर minOccurs = "1" रखना स्वचालित रूप से संतुष्ट होता है जब minOccurs = "0" वाले सभी तत्व विकल्पों के रूप में निहित होते हैं।

इस प्रकार आप मूल पोस्टर द्वारा "कम से कम एक" के लिए खाते में विफल रहे हैं, क्योंकि कोई भी तत्व दो पूरी तरह से वैकल्पिक तत्वों की 1 घटना को सही ढंग से संतुष्ट नहीं करता है।

अब तक मैं इसका समाधान नहीं ढूंढ पा रहा हूं क्योंकि minOccur/maxOccur दोनों समूह से संबंधित हैं जिसमें उन्हें परिभाषित किया गया है और नोड्स की कुल संख्या से संबंधित नहीं है।न ही आप एक ही नामित तत्व को एक से अधिक बार परिभाषित करने के लिए पसंद तत्व का उपयोग कर सकते हैं या यह "संदिग्ध" बन जाता है। मैंने कुछ उदाहरणों को विशिष्ट प्रकार के तत्वों के बजाय संदर्भों का उपयोग किया है, लेकिन मेरा मानना ​​है कि यह माइक्रोसॉफ्ट एक्सएसडी पार्सर में विफल रहता है।

<xs:choice minOccurs="1" maxOccurs="1"> 
    <xs:sequence minOccurs="1" maxOccurs="1"> 
    <xs:element name="Elem1" minOccurs="1" maxOccurs="1" /> 
    <xs:element name="Elem2" minOccurs="0" maxOccurs="1" /> 
    </xs:sequence> 
    <xs:sequence > 
    <xs:element name="Elem2" minOccurs="1" maxOccurs="1" /> 
    </xs:sequence> 
</xs:choice> 

यहाँ आप है कि या तो आप पहली बार अनुक्रम (जो Elem1 होगा लेकिन Elem2 वैकल्पिक रूप से हो सकता है) देख सकते हैं, या आप दूसरी अनुक्रम (जो Elem2 होनी चाहिए) है।

इसलिए अब आपके पास इन 2 तत्वों में से "एक या अधिक" है। बेशक यह आपके पास जितना अधिक विकल्प होगा उतना अधिक जटिल हो जाता है क्योंकि आपको सभी संभावित संयोजनों के लिए अतिरिक्त विकल्प प्रदान करने की आवश्यकता होती है।

+1

बस एक quibble: यह केवल quadratically, "तेजी से अधिक जटिल" नहीं है। लेकिन यह बोझिल है। मेरी इच्छा है कि कुछ आसान हो। – user3697176

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