2009-08-20 16 views
13

मेरे पास ऐसी स्थिति है जहां एक्सएमएल-फाइल में एक तत्व एक्सएसडी में दो अलग-अलग प्रकारों का हो सकता है।xsd वही तत्व, विभिन्न प्रकार?

मैं जो करना चाहता हूं वह सबसे पहले दर्ज मूल्य को अधिक सख्त प्रकार (यदि यह एक व्यक्ति है जो फॉर्म भरता है) को सत्यापित करने के लिए सबसे पहले है और यदि वह नहीं खींचता है, तो इसे कम सख्त प्रकार (यदि यह एक संगठन है जो फॉर्म भरता है), अन्यथा सत्यापन विफल होने दें यदि यह बिल्कुल मान्य नहीं है।

तो यह मूल रूप से यह है:

<xsd:complexType name="ForminfoType"> ` 
    <xsd:sequence> 
     <xsd:element name="formname" type="xsd:string" /> 
     <xsd:element name="timestamp" type="xsd:dateTime" /> 
     <xsd:element name="sender" type="PersonType" minOccurs="0" /> 
     <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
     <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
    </xsd:sequence> 
</xsd:complexType> 

क्या PersonType वाणी मूल रूप से एक 12 अंकों एक विशिष्ट पैटर्न के अनुसार निर्माण किया संख्या है। संगठन प्रकार की घोषणा क्या मूल रूप से केवल 10 अंकों की संख्या है।

तो मैं तार्किक करना चाहते हैं कि इस डाल करने के लिए है:

<xsd:element name="sender" type="OrganizationType" minOccurs="0" /> 
अनुक्रम में

, लेकिन आप एक ही नाम और विभिन्न प्रकार के साथ दो तत्वों नहीं हो सकता। तो मुझे लगता है कि मुझे इसे किसी अन्य तरीके से हल करना होगा।

मैं क्या पाया है था यह: http://xsd.stylusstudio.com/2007Oct/post05003.htm

जो काफी कुछ है जो मैं करना चाहता हूँ, लेकिन मुझे यकीन है कि यह संभव है नहीं कर रहा हूँ। क्या किसी को इसे हल करने के बारे में कोई और विचार है?

अग्रिम धन्यवाद।

+2

आप कोड की बहु लाइनों के लिए बैकटिक उपयोग करने के लिए नहीं करना चाहती। बस लाइनों का चयन करें और नियंत्रण-के का उपयोग करें। –

+1

@ एरिजन: कोड को सही तरीके से प्रारूपित करने के लिए, इसे हाइलाइट करें और फिर संपादक के ऊपर टूलबार में शून्य और किसी (01010 0101010) के साथ बटन पर क्लिक करें! –

उत्तर

11

नहीं, आप वास्तव में ऐसा नहीं कर सकते हैं।

<xsd:complexType name="PersonOrOrgType"> 
    <xsd:choice> 
     <xsd:element minOccurs="0" name="PersonSender" type="PersonType" /> 
     <xsd:element minOccurs="0" name="OrgSender" type="OrganizationType" /> 
    </xsd:choice> 
    </xsd:complexType> 

और फिर अपने "प्रेषक" उस प्रकार का एक उदाहरण बनाने: एक विकल्प आप इसे की तर्ज पर एक "PersonOrOrgSender" जटिल प्रकार बनाने के लिए

<xsd:element name="sender" type="PersonOrOrgType" minOccurs="0" /> 

लेकिन फिर आप करेंगे

<FormInfo> 
    <formname>string</formname> 
    <sender> 
    <OrgSender> 
     <Name>string</Name> 
    </OrgSender> 
    </sender> 
    ... 
</FormInfo> 

या

<FormInfo> 
    <formname>string</formname> 
    <sender> 
    <PersonSender> 
     <Name>string</Name> 
    </PersonSender> 
    </sender> 
    ... 
</FormInfo> 
: इस तरह XML डेटा है

आप एक भी टैग नहीं बना सकते हैं (उदा। "प्रेषक") एक मामले में एक चीज हो और दूसरा एक अलग मामले में - एक टैग में बिल्कुल एक अच्छी तरह से परिभाषित प्रकार होना चाहिए और उस प्रकार एक बार और हर समय के लिए होना चाहिए।

मार्क

+0

मार्क, दुर्भाग्यवश, मैं एक और समस्या में भाग गया, दुर्भाग्यवश, मुझे एक बच्चे नोड रखने की इजाजत नहीं थी, इसलिए मैंने इसे "या" और संगठन प्रकार को संगठन प्रकार में जोड़कर हल किया। "| [0-9] {10}" संबंध, एरिक –

1

अपने @mark_s द्वारा प्रदान समाधान के साथ मुद्दों को देखते हुए, आप कई विकल्प हैं:

  • sender के लिए दो प्रकार के साथ दो अलग-अलग XSDs बनाएँ। आपके कोड में जो सत्यापन को ट्रिगर करता है, उन्हें अनुक्रमिक रूप से चलाएं (यानी व्यक्ति तब संगठन)। इसमें अतिरिक्त लाभ है कि आपका कोड पता चलेगा कि कौन सा सत्यापन पारित किया गया है (और उस ज्ञान के आधार पर विकल्प बना सकता है)।
  • एक्सएसडी के भीतर एक स्तर को पसंद करें। ForminfoType के अंदर, दो अनुक्रमों (एक व्यक्ति, एक संगठन) के साथ एक विकल्प नोड जोड़ें।मैं पुष्टि नहीं की है, लेकिन मोटे तौर पर:

    <xsd:complexType name="ForminfoType"> 
        <xsd:choice> 
         <xsd:sequence> <!-- person --> 
          <xsd:element name="formname" type="xsd:string" /> 
          <xsd:element name="timestamp" type="xsd:dateTime" /> 
          <xsd:element name="sender" type="PersonType" minOccurs="0" /> 
          <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
         </xsd:sequence> 
         <xsd:sequence> <!-- organization --> 
          <xsd:element name="formname" type="xsd:string" /> 
          <xsd:element name="timestamp" type="xsd:dateTime" /> 
          <xsd:element name="sender" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
         </xsd:sequence> 
        </xsd:choice> 
    </xsd:complexType> 
    
संबंधित मुद्दे