XSD 元素替换
使用 XML 架构,一个元素可以替换另一个元素。
元素替换
假设我们有来自两个不同国家/地区的用户的用户:英国和挪威。我们希望能够让用户选择是否希望在 XML 文档中使用挪威语元素名称或英语元素名称。
为了解决这个问题,我们可以在 XML 架构中定义一个 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>
阻止元素替换
要阻止其他元素替换指定元素,请使用 block 属性
<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>
使用 substitutionGroup
可替换元素的类型必须与 head 元素的类型相同或派生自 head 元素的类型。如果可替换元素的类型与 head 元素的类型相同,则无需指定可替换元素的类型。
请注意,substitutionGroup 中的所有元素(head 元素和可替换元素)必须声明为全局元素,否则它将不起作用!
什么是全局元素?
全局元素是“schema”元素的直接子元素!局部元素是在其他元素中嵌套的元素。