2009-09-30 18 views
16

मान लीजिए के बजाय एक तत्व का विस्तार करने के मैं कुछ स्कीमा है:उपयोग XML स्कीमा एक complexType

<xsd:schema ...> 
    <xsd:element name="foo"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="fooElement" type="xs:string" /> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

यह कुछ तत्व foo जो इसके अंदर प्रकार स्ट्रिंग के साथ कुछ तत्व fooElement है परिभाषित करता है। अब मैं तत्व foo को तत्व barElement तत्व का विस्तार करना चाहता हूं और इस एक्सटेंशन को bar पर कॉल करना चाहता हूं।

चीजों को जटिल करने के लिए, मान लीजिए कि किसी और ने foo परिभाषित किया है और स्कीमा को बदला नहीं जा सकता है। हालांकि यहां उदाहरण छोटा है, आइए यह भी मान लें कि foo की सामग्री अधिक जटिल हो सकती है, और यह कि एक नई स्कीमा को परिभाषित करना तत्व fooElement तत्व की प्रतिलिपि बनाने जितना आसान नहीं है।

प्रभावी रूप से, मैं एक नया स्कीमा निर्धारित करना चाहते हैं:

<xsd:schema xmlns:fns="otherschema" ...> 
    <xsd:import namespace="otherschema" /> 
    <xsd:element name="bar"> 
     <xsd:complexContent> 
      <xsd:extension base="fns:foo"> 
       <xsd:sequence> 
        <xsd:element name="barElement" type="xs:string" /> 
       </xsd:sequence> 
      </xsd:extension> 
     </xsd:complexContent> 
    </xsd:element> 
</xsd:schema> 

दुर्भाग्य <xsd:extension> के base विशेषता केवल XSD प्रकार तर्क, नहीं तत्वों स्वीकार करता है। मैं एक तत्व कैसे बढ़ा सकता हूं? (क्या मैं एक तत्व का विस्तार कर सकता हूं?)

+3

महान सवाल है, मैं सटीक एक ही बात करना चाहते हैं - और मैं बदगुमान है कि यह असंभव लगता है कर रहा हूँ। पागल! –

उत्तर

8

मैं एक नया प्रकार तैयार करूंगा जो foo तत्व की नकल करता है और उसके बाद इसका विस्तार करता है। हालांकि यह सबसे अच्छा समाधान नहीं है, आपको वही परिणाम मिलता है जैसे कि आप सीधे तत्व का विस्तार करने में सक्षम थे।

<xs:complexType name="fooType"> 
    <xs:sequence> 
     <xs:element name="fooElement" type="xs:string" /> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="barType"> 
    <xs:complexContent mixed="false"> 
     <xs:extension base="fooType"> 
     <xs:sequence> 
      <xs:element name="barElement" type="xs:string" /> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

    <xs:element name="bar" type="barType" /> 
+0

क्या यह मुझे हर बार जब मैं इसे बुलाता हूं तो तत्व को समाहित करने के लिए मजबूर नहीं करता? परिणाम जैसे सिंटैक्स में के बजाय परिणामस्वरूप होगा ... जो अवांछित है। धन्यवाद -

+0

नहीं है, परिणाम मुझे लगता है कि आप जो चाह रहे थे। – Ben

+0

अपने संपादित मैं मानता हूँ के लिए इच्छुक हूँ देखते हुए: –

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