扩展中是否允许重新定义属性值?

问题描述 投票:0回答:1

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>
xml xsd libxml2 xerces msxml
1个回答
1
投票

不,这是无效的。一般规则是你不能一步一步地扩展和限制;需要分两步完成。

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.

在您的情况下会失败,因为两个属性使用的属性不同。

© www.soinside.com 2019 - 2024. All rights reserved.