[英]Restrict a child's required attribute from a parent's derived type (XSD)
因此,以下是我需要用来验证此xml的XSD文件。
<?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>
因此,先进行一些解释。 我已经定义了一个Schedule元素,它可以包含多个Event元素(类型为eventType)。 此外,我已经定义了元素Lesson,Sem研讨会和Lab来代替元素Event(替代组),以便:
课程必须包含教授元素
研讨会只能包含一个讲座元素
Lab元素的讲义不应包含“课堂”属性(禁止使用)。 在其他所有情况下,都需要教室。
我上一个遇到了问题。 基本上,为了解决这个问题,我为演讲创建了一个基本类型(baseLectureType),它仅包含演讲所需的元素,并且我从中得出了另外两种类型:
lectureType包含所需课堂属性,
包含禁止的“课堂”属性的labLectureType
但是,当我尝试验证时,出现以下错误:
错误-第109、37行:org.xml.sax.SAXParseException; lineNumber:109; columnNumber:37; rcase-Recurse.2:粒子之间没有完整的功能映射。 错误-第109、37行:org.xml.sax.SAXParseException; lineNumber:109; columnNumber:37; derivation-ok-restriction.5.4.2:类型为'labType'的错误。 该类型的粒子不是对基础粒子的有效限制。
任何提示将不胜感激。
XSD 扩展名仅添加; XSD 限制只会消失。
但是请注意,限制不能撤消强制性元素或属性的必要性。
在XSD 1.1中,可以使用断言来更好地控制类型,但是即使有了断言,也不能禁止(或使其成为可选的)必需的元素或属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.