Search code examples
xmlxsdxsd-validationxml-validation

Add string restriction to XSD


I have the following Languages element. For each Language, I want the attribute to be either "Subbed" or "Dubbed". For example:

<Languages>
    <Language Type="Subbed">EN</Language>
    <Language Type="Dubbed">FR</Language>
</Languages>

Here is the XSD I currently have -- how would I add in the "subbed|dubbed" restriction?

<xs:element name="Languages">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Language" maxOccurs="unbounded" minOccurs="0">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute type="xs:string" name="Type" use="optional"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Solution

  • You can achieve your goal with enumerations:

    Replace

    <xs:attribute type="xs:string" name="Type" use="optional"/>
    

    with

    <xs:attribute type="LanguageType" name="Type" use="optional"/>
    

    and add

    <xs:simpleType name="LanguageType">
      <xs:restriction base="xs:string">
        <xs:enumeration value="Subbed"/>
        <xs:enumeration value="Dubbed"/>
      </xs:restriction>
    </xs:simpleType>
    

    to restrict Language/@Type to be one of Subbed or Dubbed.


    Here is the above adjustment applied to a complete XSD:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               version="1.0">
      <xs:element name="Languages">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Language" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute type="LanguageType" name="Type" use="optional"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:simpleType name="LanguageType">
        <xs:restriction base="xs:string">
          <xs:enumeration value="Subbed"/>
          <xs:enumeration value="Dubbed"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:schema>
    

    This will validate your XML, as requested.