第 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>
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.