Reputation: 174
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:
Lesson must include a Professor element
Seminar must contain only one Lecture element
The lectures of Lab element should not contain the Classroom attribute (prohibited). In every other case the classroom is required.
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
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