एक्सएमएल स्कीमा एन्यूमरेशन द्वारा विशेषता को कैसे प्रतिबंधित करें


85

मेरे पास निम्न XML टैग है

<price currency="euros">20000.00</price>

मैं मुद्रा विशेषता को निम्नलिखित में से कैसे प्रतिबंधित कर सकता हूं:

  • यूरो
  • पौंड
  • डॉलर

और एक डबल करने के लिए कीमत?

जब मैं दोनों पर एक प्रकार की कोशिश करता हूं तो मुझे एक त्रुटि मिलती है, यहां मैंने अब तक जो भी पाया है:

<xs:element name="price">
    <xs:complexType>
        <xs:attribute name="currency">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="pounds" />
                    <xs:enumeration value="euros" />
                    <xs:enumeration value="dollars" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:element>

1
यदि आप ऐसा करते हैं, तो आपको <xs: विशेषता> तत्व से टाइप = "xs: string" को हटाना होगा। जब simpleType या complexType मौजूद है तो आप टाइप नहीं कर सकते।
साल

जवाबों:


116

संख्यात्मक मान आपकी मूल्य परिभाषा से गायब प्रतीत होता है। निम्नलिखित प्रयास करें:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>



<xs:element name="price">
        <xs:complexType>
            <xs:extension base="xs:decimal">
              <xs:attribute name="currency" type="curr"/>
            </xs:extension>
        </xs:complexType>
</xs:element>

3
जैसा कि @kjhughes द्वारा उत्तर दिया गया है, वह <xs:extensionसीधे बच्चा नहीं हो सकता है, <xs:complexTypeबल्कि इसके बजाय <xs:complexContentया द्वारा निहित होना चाहिए <xs:simpleContent
हांकना

22

पुराने सवाल का नया जवाब

इस पुराने प्रश्न का कोई मौजूदा उत्तर वास्तविक समस्या का समाधान नहीं करता है।

असली समस्या यह थी किXSD मेंxs:complexTypeसीधेxs:extensionतौर पर एक बच्चानहीं हो सकता। xs:simpleContentपहलेउपयोग करने के लिए ठीक है। विवरण का पालन करें ...


आपका XML,

<price currency="euros">20000.00</price>

निम्नलिखित सुधारे गए XSD में से किसी एक के विरुद्ध मान्य होगा :

स्थानीय रूप से परिभाषित विशेषता प्रकार

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

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

वैश्विक स्तर पर परिभाषित विशेषता प्रकार

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

  <xs:simpleType name="currencyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="pounds" />
      <xs:enumeration value="euros" />
      <xs:enumeration value="dollars" />
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency" type="currencyType"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

टिप्पणियाँ

वास्तविक समस्या यह थी कि XSD में xs:complexTypeसीधे xs:extensionएक बच्चे के रूप में नहीं हो सकता है ; xs:simpleContentपहले जरूरत है।

एक संबंधित मामला (जो नहीं पूछा गया था लेकिन अन्य उत्तरों को भ्रमित कर सकता है):

कैसे priceदिया जा सकता है कि यह एक विशेषता है?

इस मामले में, एक अलग, वैश्विक परिभाषा की priceTypeआवश्यकता होगी; केवल स्थानीय प्रकार की परिभाषाओं के साथ ऐसा करना संभव नहीं है।

जब तत्व की विशेषता है तो तत्व सामग्री को कैसे प्रतिबंधित करें

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

  <xs:simpleType name="priceType">  
    <xs:restriction base="xs:decimal">  
      <xs:minInclusive value="0.00"/>  
      <xs:maxInclusive value="99999.99"/>  
    </xs:restriction>  
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="priceType">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

8

आपको एक प्रकार बनाने और उस प्रकार की विशेषता बनाने की आवश्यकता है:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>

फिर:

<xs:complexType>
    <xs:attribute name="currency" type="curr"/>
</xs:complexType>

नमस्कार, दुख की बात यह है कि मुझे मूल्य प्रकार को "दोगुना" करने के लिए प्रतिबंधित नहीं किया गया है और एक ही समय में "मुद्रा" विशेषता पर प्रतिबंध लगाने
ल्यूक

-2
<xs:element name="price" type="decimal">
<xs:attribute name="currency" type="xs:string" value="(euros|pounds|dollars)" /> 
</element> 

यह गणना की आवश्यकता को पूरी तरह से समाप्त कर देगा। यदि आवश्यक हो तो आप टाइप को डबल में बदल सकते हैं।


@valueपर दिखाई नहीं दे सकता xs:attributexs:attributeके बच्चे के रूप में प्रकट नहीं हो सकता xs:element। आवश्यक xs:नामस्थान उपसर्ग छोड़े गए हैं। यह उत्तर एक गड़बड़ है और इसे केवल हटा दिया जाना चाहिए।
kjhughes
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.