2

这是一个架构:

<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 规范?

4

1 回答 1

2

XMLSpy 是对的。

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

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

但就其本身而言, 的定义D1a是错误的。在opt元素的声明中,您错过了该minOccurs属性。但它确实存在,默认值为 1。因此,它大于maxOccurs您指定的值,这当然是胡说八道。Visual Studio 想错了!

于 2013-11-06T12:33:14.183 回答