XSD 替换

创建于 2024-12-03 / 48
字体: [默认] [大] [更大]

对于XML模式,一个元素可以替代另一个元素。


元素替换

假设我们的用户来自两个不同的国家:英国和挪威。我们希望能够让用户选择在XML文档中使用挪威元素名还是英语元素名。

为了解决这个问题,我们可以在XML schema中定义一个substitutionGroup。首先,我们声明一个head元素,然后声明其他元素,这些元素声明它们可以替换head元素。

<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>

在上面的实例中,"name"元素是head元素,"navn" 元素可替换为"name"。

请看XML模式的以下片段:

<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>

<xs:complexType name="custinfo">
  <xs:sequence>
    <xs:element ref="name"/>
  </xs:sequence>
</xs:complexType>

<xs:element name="customer" type="custinfo"/>
<xs:element name="kunde" substitutionGroup="customer"/>

有效的XML文档(根据上面的模式)可以如下所示:

<customer>
  <name>John Smith</name>
</customer>

或者像这样:

<kunde>
  <navn>John Smith</navn>
</kunde>

阻塞元素替换

要防止其他元素替换为指定的元素,请使用块属性:

<xs:element name="name" type="xs:string" block="substitution"/>

请看XML模式的以下片段:

<xs:element name="name" type="xs:string" block="substitution"/>
<xs:element name="navn" substitutionGroup="name"/>

<xs:complexType name="custinfo">
  <xs:sequence>
    <xs:element ref="name"/>
  </xs:sequence>
</xs:complexType>

<xs:element name="customer" type="custinfo" block="substitution"/>
<xs:element name="kunde" substitutionGroup="customer"/>

有效的XML文档(根据上面的模式)如下所示:

<customer>
  <name>John Smith</name>
</customer>

但这不再有效:

<kunde>
  <navn>John Smith</navn>
</kunde>

使用替换组

可替换元素的类型必须与head元素的类型相同或派生自head元素的类型。如果可替换元素的类型与头元素的类型相同,则不必指定可替换元素的类型。

请注意,substitutionGroup 中的所有元素(head元素和substitutionable元素)都必须声明为全局元素,否则将无法工作!


什么是全局元素?

全局元素是"schema"元素的直接子元素!局部元素是嵌套在其他元素中的元素。



0 人点赞过