Search code examples
xmlxsd

XML Schema: how to add an attribute with restriction to a element with a sequence of child nodes


I want to add a attribute with restriction, to an element that has a sequence of child nodes. Element 'car' has a sequence for its child nodes. And attribute 'condition' for element car, has a enumeration restriction. I am not sure where to put the created complex type 'atr' in the 'car' element.

This is what I have come up so far:

<test>
  <car condition = "new">
    <brand>audi</brand>
    <engine>diesel</engine>  
  </car>
</test>

XSD:

<xs:element name = "car">
  <xs:complexType>
    <xs:sequence>
        <xs:element name = "brand" type = "xs:string"/>
        <xs:element name = "engine" type = "xs:string"/>
    </xs:sequence>
    <xs:attribute name = "condition" type = "atr"/>
  </xs:complexType>
</xs:element>

<xs:complexType name = "atr">
  <xs:simpleContent>
    <xs:extension base = "xs:string">
      <xs:attribute name = "condition">
        <xs:simpleType>
          <xs:restriction base = "xs:string">
            <xs:enumeration value = "new"/>
            <xs:enumeration value = "used"/>          
          </xs:restriction>        
        </xs:simpleType>      
      </xs:attribute>    
    </xs:extension>  
  </xs:simpleContent>
</xs:complexType>

<xs:element name = "test">
<xs:complexType>
  <xs:sequence>
    <xs:element ref = "car" maxOccurs = "unbounded"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Solution

  • An attribute has a simple type always so just use

    <xs:element name = "car">
      <xs:complexType>
        <xs:sequence>
            <xs:element name = "brand" type = "xs:string"/>
            <xs:element name = "engine" type = "xs:string"/>
        </xs:sequence>
        <xs:attribute name = "condition" type = "atr"/>
      </xs:complexType>
    </xs:element>
    
    <xs:simpleType name = "atr">
      <xs:restriction base = "xs:string">
        <xs:enumeration value = "new"/>
        <xs:enumeration value = "used"/>          
      </xs:restriction>
    </xs:simpleType>