如何使用标识约束扩展元素?

时间:2013-12-01 02:32:50

标签: xml xsd

在Xml架构中,我定义了一个带有一些子元素的复杂类型的元素A。该元素A还要求其子元素的特定属性的值具有唯一性。

想象一下(并假设local被声明为模式的目标命名空间的名称空间前缀):

<xs:element name="A">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="child">
                <xs:complexType>
                    <xs:attribute name="id" type="xs:string"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:unique name="childIdUniqueness">
        <xs:selector xpath="local:child"/>
        <xs:field xpath="@id"/>
    </xs:unique>
</xs:element>

现在,我需要一个非常相似的元素B,其行为与A完全相同,但还有name属性。

如何将元素A的定义扩展为具有附加属性的元素B

非常类似的问题,例如thisthis指出,不应扩展元素,而应扩展复杂类型。

但是,它们没有解决复杂类型定义中不包含uniquekeykeyref等身份约束的问题,而是直接在元素定义中( cf. Xml Schema引用,例如this one)。因此,这将要求我复制所有身份约束(与上面简化的示例代码相反,我的实际文档具有各种身份约束)到每个派生元素定义 - 在基于维护的更改的情况下的严重错误源约束。

更重要的是,MSDN意味着对身份约束的name属性的值的唯一性要求。虽然属性描述使用模糊术语身份约束集来表示唯一性范围,但keyref的文档清楚地表明这些名称可用于明确地识别其中的身份约束。 schema,因此身份约束名称在整个架构中必须是唯一的。因此,即使复制和粘贴整个身份约束块也行不通,我必须为每个出现事件重命名每个身份约束。

有没有处理这种情况的惯例?

1 个答案:

答案 0 :(得分:0)

没有办法绕过它。身份约束与元素相关联;元素不是为参与继承方案而设计的。实现重用定义的唯一方法(例如您想要的定义)在此时是专有的。一种方法可能涉及自定义标记,某种描述重用的语法糖,以及相关的后处理步骤,以使其符合XSD规范,这是XSD版本管理过程的所有部分(我称之为XML)模式重构,XSR)。