XSD规范是否允许在<extension>派生类型中重定义属性默认/固定值?
XSD扩展派生中重定义属性的规范说明
官方规范要求
根据W3C的XML Schema(XSD 1.0/1.1)官方规范,使用<xs:extension>进行类型扩展时,不允许重定义基类型中已存在的属性——无论该属性原本是否带有默认值或固定值。规范明确规定,扩展内容仅能添加新的属性、元素或模型组,不得修改或重定义基类型已声明的属性。
不同解析器的表现差异
- MSXML与Xerces-C:对这类不符合规范的写法做了兼容处理,允许通过扩展重定义属性并添加默认/固定值,属于宽松实现。
- libxml2:严格遵循官方规范,会直接拒绝此类XSD输入并抛出验证错误。
示例代码说明
以下是你提供的示例XSD,其中Child类型试图通过扩展Parent类型重定义name属性并添加固定值:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="Parent"> <xs:sequence> <xs:element name="node1" type="xs:string"/> </xs:sequence> <xs:attribute name="name" type="xs:string"/> </xs:complexType> <xs:complexType name="Child"> <xs:complexContent> <xs:extension base="Parent"> <xs:sequence> <xs:element name="node2" type="xs:string"/> </xs:sequence> <xs:attribute name="name" type="xs:string" fixed="value1"/> </xs:extension> </xs:complexContent> </xs:complexType> <xs:element name="Child" type="Child"/> </xs:schema>
按照官方规范,这段XSD属于不合法写法,libxml2的拒绝是符合标准的行为,而MSXML和Xerces-C的支持属于非标准兼容。
内容的提问来源于stack exchange,提问作者Davide Capodaglio
相关产品推荐
相关产品推荐

