在XML Schema,一个元素可以代替另一个元素。
元素替代
比方说,我们有来自两个不同国家的用户:英格兰和挪威。 我们希望让用户选择他或她是否想在XML文档中使用挪威元素名或英文元素名称的能力。
为了解决这个问题,我们可以定义一个substitutionGroup在XML模式。 首先,我们声明一个头元素,然后我们声明,其中指出,他们可替代头元素的其他元素。
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
在上面的例子中, "name"元件是头元件和"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文档(according to the schema above)看起来是这样的:
<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文档(according to the schema above)如下:
<customer>
<name>John Smith</name>
</customer>
但是,这是不再有效:
<kunde>
<navn>John Smith</navn>
</kunde>
使用substitutionGroup
类型可取代的元素必须是相同的,或从头部元件的类型的。 如果该取代的元素的类型是一样的头元素的类型你不会有指定取代元素的类型。
请注意,在substitutionGroup所有元素(head元素和替代元素)必须声明为全局元素,否则将无法正常工作!
什么是全球要素是什么?
全局元素是属于的直接子元素的"schema"的元素! 本地元素嵌套在其他元素中的元素。