第 37 章 element Substitution
摘要
XML Schema 替换组允许您定义一组可替换顶级或 head 元素的元素。当您有多个共享共同基础类型或需要交换的元素时,这很有用。
37.1. 在 XML Schema 中替换组
概述
替换组是 XML 模式的一项功能,允许您指定元素,它可以替换从该架构生成的文档中另一元素。可替换元素称为 head 元素,必须在 schema 的全局范围内定义。替换组的元素必须与 head 元素相同,或者派生自 head 元素的类型。
本质上,可以使用一个替换组来构建一组可使用通用元素指定的元素。例如,如果您正在为某个公司建立一个排序系统,它会销售三类小部件,您可以定义一个通用小部件元素,该元素包含所有三种小部件类型的一组常用数据。然后,您可以定义一个包含一组更具体的小部件数据的替换组。在合同中,您可以将通用小部件元素指定为消息部分,而不是为每种类型的小部件定义特定的排序操作。构建实际消息后,消息可以包含替换组的任何元素。
语法
使用 XML Schema 元素的 substitutionGroup
属性定义替换组。substitutionGroup
属性的值是要替换的元素的名称。例如,如果您的 head 元素是 widget
,将属性 substitutionGroup="widget" 添加到名为 woodWidget
的元素中,您可以使用 widget
元素,您可以替换 woodWidget
元素。这显示在 例 37.1 “使用 Substitution Group” 中。
例 37.1. 使用 Substitution Group
<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 元素 定义为 小部件类型。
替换组的每个元素都会扩展
widgetType
以包含特定于小部件的数据。
根据 例 37.2 “使用复杂类型替换组” 中的架构 ,例 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>