第 37 章 element Substitution

摘要

借助 XML 架构替换组,您可以定义一组可替换顶层或 head 的元素的元素。当您拥有多个共享通用基础类型或需要交换的元素的元素时,这很有用。

37.1. 在 XML Schema 中替换组

概述

替换组是 XML 模式的功能,允许您指定可替换从该架构生成的文档中另一元素的元素。可替换元素称为 head 元素,且必须在 schema 的全局范围内定义。替换组的元素必须是与 head 元素相同的类型,或者从 head 元素类型派生的类型。

本质上,替换组允许您构建一组可使用通用元素来指定的元素。例如,如果您为公司构建了一个排序系统,它销售三种类型的小部件,您可以定义一个包含全部三种小部件类型通用数据的通用小部件元素。然后,您可以定义一个替换组,其中包含每种类型的小部件的一组特定数据集。然后,您可以将通用 widget 元素指定为消息部分,而不为每种小部件定义特定排序操作。构建实际消息时,消息可以包含替换组的任何元素。

语法

替换组使用 XML 架构 元素的 replace Group 属性来定义。replace Group 属性的值是所定义元素的元素的名称。例如,如果您的 head 元素是 widget,请将属性 replaceGroup="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 “使用复杂类型替换组” 中的 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 中的抽象类类似,因为它们用作定义更具体的通用类实施的基础。抽象头还阻止在最终产品中使用 generic 元素。

您可以通过将元素的 abstract 属性设置为 true 来声明 一个抽象元素,如 例 37.4 “抽象头定义” 所示。使用此架构时,有效的 review 元素可以包含 正向 元素或 负请求 元素,但不能 包含注释 元素。

例 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>