这是一个架构:
<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规范?
答案 0 :(得分:2)
XMLSpy是对的。
根据XSD规范,当您限制complexType时,必须重新定义元素内容模型完全重新,但新定义必须符合旧定义。
没有从基本类型的定义方式继承特定设置(事实上,您甚至可以使用不同的结构定义相同的内容模型)。
但就其本身而言,D1a
的定义是错误的。
在opt
元素的声明中,您会错过minOccurs
属性。
但它确实存在,默认值为1。
所以,它大于你指定的maxOccurs
,当然这是无稽之谈。 Visual Studio认为错了!