loukwn
loukwn

Reputation: 174

Restrict a child's required attribute from a parent's derived type (XSD)

So the following is an XSD file that I need to use to validate this xml.

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                  targetNamespace="schedule"
                  xmlns="schedule"
                  elementFormDefault="qualified">

<xsd:element name="Schedule">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element ref="Event" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

<!-- Event and eventType declaration-->
<xsd:element name="Event" type="eventType"/>
<xsd:complexType name="eventType">
    <xsd:sequence>
        <xsd:element name="Title" type="xsd:string" />
        <xsd:element name="Lecture" type="lectureType" maxOccurs="9" minOccurs="1" />
    </xsd:sequence>
</xsd:complexType>

<!-- default data that a lecture must contain -->
<xsd:group name="lectureContentGroup">
    <xsd:sequence>
        <xsd:element name="Day">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:enumeration value="Monday"/>
                    <xsd:enumeration value="Tuesday"/>
                    <xsd:enumeration value="Wednesday"/>
                    <xsd:enumeration value="Thursday"/>
                    <xsd:enumeration value="Friday"/>
                    <xsd:enumeration value="Saturday"/>
                    <xsd:enumeration value="Sunday"/>                                                
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:element>
        <xsd:element name="Time">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:pattern value="[0-9][0-9][:][0-9][0-9][\-][0-9][0-9][:][0-9][0-9]"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:element>
    </xsd:sequence>
</xsd:group>

<!-- base lecture type without any attributes -->
<xsd:complexType name="baseLectureType">
    <xsd:group ref="lectureContentGroup" />
</xsd:complexType>

<!-- lecture type that contains the required attribute Classroom -->
<xsd:complexType name="lectureType">
    <xsd:complexContent>
        <xsd:extension base="baseLectureType">
            <xsd:group ref="lectureContentGroup" />
            <xsd:attribute name="Classroom" use="required">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:maxLength value="7"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:attribute>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<!-- lecture type that contains a prohibited Classroom attribute -->
<xsd:complexType name="labLectureType">
    <xsd:complexContent>
        <xsd:extension base="baseLectureType">
            <xsd:group ref="lectureContentGroup" />
            <xsd:attribute name="Classroom" use="prohibited">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:maxLength value="7"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:attribute>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<!-- lessonType, seminarType and labType declaration -->
<xsd:complexType name="lessonType">
    <xsd:complexContent>
        <xsd:extension base="eventType">
            <xsd:sequence>
                <xsd:element name="Professor" type="xsd:string" />
            </xsd:sequence>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="seminarType">
    <xsd:complexContent>
        <xsd:restriction base="eventType">
            <xsd:sequence>
                <xsd:element name="Title" type="xsd:string" />
                <xsd:element name="Lecture" type="lectureType" />
            </xsd:sequence>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="labType">
    <xsd:complexContent>
        <xsd:restriction base="eventType">
            <xsd:sequence>
                <xsd:element name="Title" type="xsd:string" />
                <xsd:element name="Lecture" type="labLectureType" maxOccurs="9" minOccurs="1" />
            </xsd:sequence>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType> 

<!-- Lesson, Seminar, Lab -->
<xsd:element name="Lesson" type="lessonType" substitutionGroup="Event" />
<xsd:element name="Seminar" type="seminarType" substitutionGroup="Event" />
<xsd:element name="Lab" type="labType" substitutionGroup="Event" />

</xsd:schema>

So a little explanation first. Ι have defined a Schedule element that can contain multiple Event elements (of type "eventType"). Furthermore I have defined the elements Lesson, Seminar and Lab that substitute the element Event (substitution group), so as:

I have been having problems with the last one. Basically to solve it I have created a base type for the lectures (baseLectureType) that contains only the elements a lecture needs, and I have derived 2 other types from this:

lectureType that contains the required Classroom attribute and

labLectureType that contains the prohibited Classroom attribute

However when I try to validate, I get the following errors:

Error - Line 109, 37: org.xml.sax.SAXParseException; lineNumber: 109; columnNumber: 37; rcase-Recurse.2: There is not a complete functional mapping between the particles. Error - Line 109, 37: org.xml.sax.SAXParseException; lineNumber: 109; columnNumber: 37; derivation-ok-restriction.5.4.2: Error for type 'labType'. The particle of the type is not a valid restriction of the particle of the base.

Any tips would be appreciated.

Upvotes: 0

Views: 480

Answers (1)

kjhughes
kjhughes

Reputation: 111491

XSD extension only adds; XSD restriction only takes away.

Note, however, that restriction cannot undo requiredness of mandatory elements or attributes.

In XSD 1.1, you could use assertions to gain finer control over types, but even with assertions, you couldn't prohibit (or make optional) required elements or attributes.

Upvotes: 1

Related Questions