XSD: How to restrict enumeration values of a derived complex type?

24,757

Solution 1

Nope, unfortunately you cannot do that. There is no way to restrict an enumeration like that, and you also would have trouble both extending and restricting a complex type at the same time. There is a good article what you can do with enumerations here.

Maybe consider working bottom-up instead: define a basic book type with almost nothing in it; then define a LyricType that is a union of the basic type and some more values; carry the bookCode in the sub-types. It's not ideal, but alas, XSD does not always align with object-oriented languages.

Solution 2

Ultimately .. you are trying to validate a node using value of the other (Parent or sibling or etc) .. Which is certainly not possible ..

Share:
24,757
tobsen
Author by

tobsen

Updated on February 16, 2020

Comments

  • tobsen
    tobsen over 4 years

    Given the following example:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:complexType name="Book" abstract="true">
            <xs:sequence>
                <xs:element name="titel" type="xs:string">
                </xs:element>
                <xs:element name="bookCode" type="BookEnum"/>
            </xs:sequence>
        </xs:complexType>
        <xs:complexType name="Lyric">
            <xs:complexContent>
                <xs:extension base="Book">
                    <xs:sequence>
                        <xs:element name="author" type="xs:string">
                        </xs:element>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
        <xs:simpleType name="BookEnum">
            <xs:restriction base="xs:int">
                <xs:enumeration value="Paperback"/>
                <xs:enumeration value="Hardcover"/>
                <xs:enumeration value="Liporello"/>
                <xs:enumeration value="None"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:schema>
    

    Lyric derives from Book. I would like to restrict the possible values of the BookEnum for the complexType "Lyric" to be "Paperback".

    "None", "Liporello" and "Hardcover" should no longer be valid values for "Lyric". can this be done in xsd?