【问题标题】:Restrict a child's required attribute from a parent's derived type (XSD)将子项的必需属性限制为父项的派生类型 (XSD)
【发布时间】:2017-11-17 03:07:12
【问题描述】:

所以下面是我需要用来验证this 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”)。此外,我定义了替换元素 Event(替换组)的元素 Lesson、Seminar 和 Lab,例如:

  • 课程必须包含教授元素

  • 研讨会必须只包含一个讲座元素

  • Lab 元素的讲座不应包含 Classroom 属性(禁止)。在所有其他情况下,教室都是必需的。

我在最后一个问题上遇到了问题。基本上为了解决这个问题,我为讲座创建了一个基本类型(baseLectureType),它只包含讲座需要的元素,并且我从中派生了另外两种类型:

lectureType,包含所需的 Classroom 属性和

labLectureType,包含禁止的 Classroom 属性

但是,当我尝试验证时,出现以下错误:

错误 - 第 109、37 行:org.xml.sax.SAXParseException;行号:109;列号:37; rcase-Recurse.2:粒子之间没有完整的函数映射。 错误 - 第 109、37 行:org.xml.sax.SAXParseException;行号:109;列号:37; derivation-ok-restriction.5.4.2:“labType”类型错误。类型的粒子不是基粒子的有效限制。

任何提示将不胜感激。

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    XSD extension 只添加; XSD 限制只会取消。

    但是请注意,该限制不能取消强制元素或属性的必要性。

    在 XSD 1.1 中,您可以使用断言来更好地控制类型,但即使使用断言,您也无法禁止(或使其成为可选)必需的元素或属性。

    【讨论】:

    • 所以实际上根本没有解决方案?因为据我所知,唯一的方法是首先将“教室”属性设为可选,而不是必需,这样才能正常工作,不是吗?
    猜你喜欢
    • 2012-03-26
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多