XSD 的官方规范是否允许使用
<extension>
在派生类型中重新定义属性值(默认/固定)?
MSXML 和 Xerces-C 都允许这样做,但 libxml2 不允许(不接受输入 XSD)。
在下面的示例中,“Parent”声明了一个没有值的属性名称,“Child”对其应用了固定值。
<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>
不,这是无效的。一般规则是你不能一步一步地扩展和限制;需要分两步完成。
Saxon 以稍微不同(并且不是很有帮助)的方式报告错误:
Error on line 9 of test.xsd:
Attribute @name appears more than once in attribute group
是的,这里没有显式的属性组,但是每个复杂类型都有一个隐式的属性组,这就是它所抱怨的。
从规范来看,XSD 1.1 描述规则的方式总体上比 XSD 1.0 更容易遵循,在这种情况下我认为没有实质性的变化。
在 XSD 1.1 第 1 部分,第 3.4.2.4 节中属性使用属性的映射规则表示 {attribute use} 是基本类型和扩展类型的属性的并集。 “Union”在规范中没有非常明确地定义,但它通常意味着您消除了精确的重复项,在这种情况下,属性定义不是精确的重复项,因为一个具有“固定”值,而另一个则没有。
然后第 3.4.6.2 节推导有效(扩展)规则 1.2 说:
B.{属性使用} [必须是] T.{属性使用}的子集。也就是说,对于 每个属性在B中使用U。{属性使用},有一个属性使用 在 T.{属性使用} 中,其属性递归地与 那些U.
在您的情况下会失败,因为两个属性使用的属性不同。