第 37 章 元素替换
摘要
XML 架构替换组允许您定义可替换顶级或 head 元素的一组元素。当您有多个共享一个通用基本类型或需要交换的元素时,这非常有用。
37.1. 在 XML Schema 中替换组
概述
替换组是 XML 模式的一种功能,允许您指定可替换从该模式生成的文档中的另一个元素的元素。replaceable 元素称为 head 元素,必须在模式的全局范围内定义。替换组的元素必须与 head 元素或从 head 元素类型派生的类型相同。
本质上,通过替换组,您可以构建可以使用通用元素指定的元素集合。例如,如果您要为销售三种类型的小部件的公司构建排序系统,您可以定义一个通用小部件元素,其中包含所有三种小部件类型的一组通用数据。然后,您可以定义一个替换组,其中包含每种小部件类型更具体的数据集。然后,您可以将通用小部件元素指定为消息部分,而不是为每种小部件定义特定的排序操作。当构建实际消息时,消息可以包含替换组的任何元素。
语法
使用 XML Schema 元素的
replacementGroup 属性来定义替换组
。replacement Group
属性的值是要定义的元素替换的元素的名称。例如,如果您的 head 元素是 widget
,将属性 replaceGroup="widget" 添加到名为 woodWidget
的元素中,指定使用 widget
元素的任何元素,您可以替换 woodWidget
元素。这在 例 37.1 “使用替换组” 中显示。
例 37.1. 使用替换组
<element name="widget" type="xsd:string" />
<element name="woodWidget" type="xsd:string"
substitutionGroup="widget" />
类型限制
替换组的元素必须与 head 元素或从 head 元素类型派生的类型相同。例如,如果 head 元素类型为 xsd:int
,则替换组的所有成员都必须是 xsd:int
类型,或者派生自 xsd:int
的类型。您还可以定义一个与 例 37.2 “使用复杂类型替换组” 中显示的替换组,其中替换组的元素是从 head 元素类型派生的类型。
例 37.2. 使用复杂类型替换组
<complexType name="widgetType"> <sequence> <element name="shape" type="xsd:string" /> <element name="color" type="xsd:string" /> </sequence> </complexType> <complexType name="woodWidgetType"> <complexContent> <extension base="widgetType"> <sequence> <element name="woodType" type="xsd:string" /> </sequence> </extension> </complexContent> </complexType> <complexType name="plasticWidgetType"> <complexContent> <extension base="widgetType"> <sequence> <element name="moldProcess" type="xsd:string" /> </sequence> </extension> </complexContent> </complexType> <element name="widget" type="widgetType" /> <element name="woodWidget" type="woodWidgetType" substitutionGroup="widget" /> <element name="plasticWidget" type="plasticWidgetType" substitutionGroup="widget" /> <complexType name="partType"> <sequence> <element ref="widget" /> </sequence> </complexType> <element name="part" type="partType" />
替换组的 head 元素定义为
类型。替换组的每个元素都扩展 widget
TypewidgetType
,使其包含特定于排序该小部件类型的数据。
根据 例 37.2 “使用复杂类型替换组” 中的 schema ,例 37.3 “使用 Substitution Group 的 XML 文档”
中的部分元素有效。
例 37.3. 使用 Substitution Group 的 XML 文档
<part> <widget> <shape>round</shape> <color>blue</color> </widget> </part> <part> <plasticWidget> <shape>round</shape> <color>blue</color> <moldProcess>sandCast</moldProcess> </plasticWidget> </part> <part> <woodWidget> <shape>round</shape> <color>blue</color> <woodType>elm</woodType> </woodWidget> </part>
抽象头元素
您可以定义一个抽象头元素,它永远不会出现在使用您的 schema 生成的文档中。抽象头元素与 Java 中的抽象类类似,因为它们被用作定义更具体的通用类实现的基础。抽象头还可防止在最终产品中使用通用元素。
您可以通过将元素元素的 abstract
属性设置为 true
来声明抽象头 元素
,如 例 37.4 “抽象头定义” 所示。使用这个模式,有效的 review
元素可以包含 正注释
元素 或负注释
元素,但不能包含 comment
元素。
例 37.4. 抽象头定义
<element name="comment" type="xsd:string" abstract="true" />
<element name="positiveComment" type="xsd:string"
substitutionGroup="comment" />
<element name="negtiveComment" type="xsd:string"
substitutionGroup="comment" />
<element name="review">
<complexContent>
<all>
<element name="custName" type="xsd:string" />
<element name="impression" ref="comment" />
</all>
</complexContent>
</element>