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>
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.