当前位置: 首页 > 知识库问答 >
问题:

从父级的派生类型(XSD)限制子级的必需属性

卫劲
2023-03-14

下面是一个XSD文件,我需要用它来验证这个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>

所以先解释一下。我定义了一个可以包含多个事件元素(类型为“eventType”)的计划元素。此外,我还定义了替换元素事件(替换组)的元素课程、研讨会和实验室,以便:

>

  • 课程必须包含教授元素

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

    实验元素的讲座不应包含教室属性(禁止)。在其他任何情况下,教室都是必需的。

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

    包含所需课堂属性和

    包含禁止的Classroom属性

    然而,当我试图验证时,我得到以下错误:

    错误-第109行,37:org.xml.sax.SAXParseExcture; lineNumber: 109;柱号: 37; rcase-Recurse.2:粒子之间没有完整的函数映射。错误-第109行,37:org.xml.sax.SAXParseExcture; lineNumber: 109;栏位号: 37;派生-ok-限制.5.4.2:类型'labType'的错误。类型的粒子不是基粒子的有效限制。

    任何提示都将不胜感激。

  • 共有1个答案

    昝涛
    2023-03-14

    XSD扩展只添加;XSD限制只会带来好处。

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

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

     类似资料:
    • 在应用程序中使用JavaFX,我有一个main.fxml文件,其中包含一些fxml子文件。 我想从子控制器访问Main.fxml的MainController类。 我试着用一个例子来解释得更好: MainFXML: 主控制器: ChildFXML:

    • 问题内容: 在我的应用中,我必须经常在两种布局之间切换。错误在下面发布的布局中发生。 第一次调用布局时,没有发生任何错误,一切都很好。然后,当我调用不同的布局(空白),然后再次调用我的布局时,出现以下错误: 我的布局代码如下所示: 我知道之前曾有人问过这个问题,但对我来说没有帮助。 问题答案: 错误消息说明你应该做什么。

    • 假设我有一个应用程序来处理一系列的书。 我的应用程序允许向库中添加新书。创建书籍时,用户可以在列表中选择作者,如果作者尚不存在,则可以将其添加到列表中,并在表单字段中提供其姓名。填写表单后,数据将发送到WS,类似 然后我将json映射到我的实体中 书: 作者 这不会像用户尝试添加新作者一样工作,当我尝试. sav()时,我会收到错误: 组织。冬眠TransientPropertyValueExce

    • 问题是要确定子数据的总和是否等于父数据。如果是,返回真,否则返回假。 下面是我的代码,在提交时出现错误。我知道这是一个简单的问题,但在编写了条件之后,我很难通过遍历所有左右节点来递归检查二叉树中每个节点的和条件。 请指导我,因为我哪里做错了。

    • 我有两个组成部分: 父组件 子组件 我试图从Parent调用child的方法,我尝试了这种方法,但无法得到结果: 有没有办法从父级调用子级的方法? 注意:子组件和父组件在两个不同的文件中。

    • 问题内容: 我有两个组成部分。 父组件 子组件 我试图从父级调用孩子的方法,我尝试过这种方法,但没有得到结果 有没有一种方法可以从父级调用子级的方法? 注意:子组件和父组件位于两个不同的文件中 问题答案: 首先,让我表示,这通常 不是 在React领域中解决问题的方法。通常,您要做的是将功能传递给道具中的子代,并传递事件中的子代的通知(或者更好的是:)。 但是,如果 必须 在子组件上公开命令式方法