在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
?
非常类似的问题,例如this或this指出,不应扩展元素,而应扩展复杂类型。
但是,它们没有解决复杂类型定义中不包含unique
,key
或keyref
等身份约束的问题,而是直接在元素定义中( cf. Xml Schema引用,例如this one)。因此,这将要求我复制所有身份约束(与上面简化的示例代码相反,我的实际文档具有各种身份约束)到每个派生元素定义 - 在基于维护的更改的情况下的严重错误源约束。
更重要的是,MSDN意味着对身份约束的name
属性的值的唯一性要求。虽然属性描述使用模糊术语身份约束集来表示唯一性范围,但keyref
的文档清楚地表明这些名称可用于明确地识别其中的身份约束。 schema,因此身份约束名称在整个架构中必须是唯一的。因此,即使复制和粘贴整个身份约束块也行不通,我必须为每个出现事件重命名每个身份约束。
有没有处理这种情况的惯例?
答案 0 :(得分:0)
没有办法绕过它。身份约束与元素相关联;元素不是为参与继承方案而设计的。实现重用定义的唯一方法(例如您想要的定义)在此时是专有的。一种方法可能涉及自定义标记,某种描述重用的语法糖,以及相关的后处理步骤,以使其符合XSD规范,这是XSD版本管理过程的所有部分(我称之为XML)模式重构,XSR)。