第 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 Type 类型。替换组的每个元素都扩展 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 中的抽象类类似,因为它们被用作定义更具体的通用类实现的基础。抽象头还可防止在最终产品中使用通用元素。

您可以通过将元素元素的 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.