限制继承的类型是否为其元素继承了minOccurs和maxOccurs?

时间:2013-11-06 11:28:44

标签: inheritance xsd

这是一个架构:

<xs:complexType name="Base">
    <xs:sequence>
        <xs:element name="opt" minOccurs="0" />
    </xs:sequence>
</xs:complexType>

<xs:complexType name="D1a">
    <xs:complexContent>
        <xs:restriction base="Base">
            <xs:sequence>
                <xs:element name="opt" maxOccurs="0" />
            </xs:sequence>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="D1b">
    <xs:complexContent>
        <xs:restriction base="Base">
            <xs:sequence>
                <xs:element name="opt" minOccurs="0" maxOccurs="0" />
            </xs:sequence>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="D1c">
    <xs:complexContent>
        <xs:restriction base="Base">
            <xs:sequence>
            </xs:sequence>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

Visual Studio无错误地验证shema。但XMLSpy表示 D1a 无效,因为maxOccurs不应小于minOccurs。似乎Visual Studio认为minOccurs继承自 Base 并且等于0.但是XMLSpy认为minOccurs不应该继承自 Base 并且等于1(默认值)。

哪种行为符合XSD规范?

1 个答案:

答案 0 :(得分:2)

XMLSpy是对的。

根据XSD规范,当您限制complexType时,必须重新定义元素内容模型完全重新,但新定义必须符合旧定义。

没有从基本类型的定义方式继承特定设置(事实上,您甚至可以使用不同的结构定义相同的内容模型)。

但就其本身而言,D1a的定义是错误的。 在opt元素的声明中,您会错过minOccurs属性。 但它确实存在,默认值为1。 所以,它大于你指定的maxOccurs,当然这是无稽之谈。 Visual Studio认为错了!