2011-06-20 15 views
17

के तत्वों के साथ एक्सएसडी मेरे पास दो एक्सएसडी हैं जो विभिन्न दस्तावेजों को परिभाषित कर रहे हैं। कहें A.xsd कुछ जटिल नियमों के साथ रूट के रूप में ElementA तत्व को परिभाषित करता है। अब B.xsd किसी तत्व को ElementB परिभाषित करता है जिसे ElementA का उपयोग कहीं भी किया जाता है।अन्य नामस्थान

<?xml version="1.0" encoding="utf-8"?> 
<ElementB xmlns="http://example.com/namespace/for/ElementB"> 
    <foo>Bla</foo> 
    <bar>Blub</bar> 
    <ElementA xmlns="http://example.com/namespace/for/ElementA"> 
    <!-- ... --> 
    </ElementA> 
</ElementB> 

फिर B.xsd ऐसा दिखाई दे सकता:

उदाहरण के लिए मैं इस तरह ElementB देखने के लिए एक्सएमएल फ़ाइल चाहते

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns="http://example.com/namespace/for/ElementB" targetNamespace="http://example.com/namespace/for/ElementB" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="ElementB"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="foo" type="xs:string" /> 
     <xs:element name="bar" type="xs:string" /> 

     <!-- And now I want to include ElementA somehow --> 
     <xs:element name="ElementA" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

बात यह है कि मैं नहीं है वास्तव में क्लोन करना चाहते हैं ElementA का B.xsd में विनिर्देशन, क्योंकि दस्तावेज़ भी हैं, जिनके पास रूट के रूप में ElementA है (यानी ElementB किसी प्रकार का कंटेनर दस्तावेज़ है)।

तो, मैं ElementAElementB के भीतर कैसे पहले से मौजूद एक्सएसडी के शीर्ष पर पूरी तरह से निर्माण कर सकता हूं?

उत्तर

29

एक्सएमएल स्कीमा दस्तावेज़ों को लिखने के लिए वास्तव में दो अलग-अलग तरीके हैं: <xs:import> और <xs:include>। xs: शामिल करने का इरादा तब किया जाना चाहिए जब उस दस्तावेज़ का नामस्थान संदर्भित किया जा सके जैसा कि संदर्भित किया जा रहा है, इसलिए यह काफी नहीं है जिसे आप ढूंढ रहे हैं। xs: आयात आपकी स्थिति के लिए बेहतर है जब आपको संदर्भित स्कीमा में तत्वों के सभी (या सबसेट) को संदर्भित करने की आवश्यकता होती है और वे एक अलग लक्ष्य नामस्थान में हैं। मतभेदों पर यहां एक प्रश्न है: What's the difference between xsd:include and xsd:import?

वैसे भी, इस विशिष्ट प्रश्न पर वापस जाएं। क्या आप शायद चाहते हैं कुछ इस तरह है:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema 
    xmlns="http://example.com/namespace/for/ElementB" 
    targetNamespace="http://example.com/namespace/for/ElementB" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    xmlns:ea="http://example.com/namespace/for/ElementA"> 
<xs:import namespace="http://example.com/namespace/for/ElementA" schemaLocation="A.xsd" /> 
<xs:element name="ElementB"> 
    <xs:complexType> 
    <xs:sequence> 
    <xs:element name="foo" type="xs:string" /> 
    <xs:element name="bar" type="xs:string" /> 
    <!-- This introduces a element named ElementA that uses the ComplexType ea:ElementA defined in A.xsd --> 
    <xs:element name="ElementA" type="ea:ElementA" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

हालांकि आप elementa कि आप B.xsd में उपयोग कर सकते हैं दिखाया गया है के लिए एक जटिल प्रकार बनाने के लिए A.xsd की आवश्यकता होगी।

यह arcticle कुछ अच्छी जानकारी/उदाहरण है और विभिन्न composability रणनीतियों में से कुछ की चर्चा में शामिल हैं: http://www.xfront.com/ZeroOneOrManyNamespaces.html

+0

धन्यवाद, यह काफी अच्छा लगता है, मैं कोशिश करूँगा। हालांकि एक प्रश्न, 'ea:' नेमस्पेस उपसर्ग कहां से आता है? या यह है कि टाइप नाम परिभाषा 'एक्सएसडी' में हो जाती है? – poke

+0

बस कोड विंडो पर दाईं ओर स्क्रॉल करें - इसे xs में अंतिम विशेषता के रूप में संदर्भित किया गया है: स्कीमा तत्व: 'xmlns: ea =" http://example.com/namespace/for/ElementA "'। आप जो भी उपसर्ग चाहते हैं उसे दे सकते हैं, जैसे आप डिफ़ॉल्ट लक्ष्य नामस्थान के लिए कर सकते हैं (हालांकि हर कोई हमेशा परंपरा द्वारा 'xs' या 'xsd' चुनता है)। – daveaglick

+0

ओह, उस तक स्क्रॉल करने के लिए परेशान नहीं था और उसे याद किया, क्षमा करें xD आपकी मदद के लिए भी धन्यवाद, मैं इसे जल्द से जल्द कोशिश करूँगा और अपने परिणाम पोस्ट करूँगा :) – poke

1

आप किसी अन्य नामस्थान के साथ स्कीमा आयात करने के लिए <xsd:import> टैग का उपयोग कर सकते हैं।

+2

तुम मुझे का उपयोग करने के लिए कैसे है कि ऊपर मेरी उदाहरण के साथ का एक उदाहरण दे सकते हैं? आपका लिंक वास्तव में यह समझाता नहीं है .. – poke

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