XML Schema 元素替换

XML Schema 可以用一个元素替换另一个元素

元素替换

举个例子,我们的用户来自英国和挪威,我们希望有能力让用户选择在 XML 文档中使用挪威语的元素名称还是英语的元素名称

为了解决这个问题,我们可以在 XML schema 中定义一个 substitutionGroup 属性

首先,我们声明主元素,然后我们会声明次元素,这些次元素可声明它们能够替换主元素

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

上面的范例中,"name" 元素是主元素,而 "navn" 元素可替代 "name" 元素

再看下面这个 XML schema 的片段

<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 文档类似这样 ( 根据上面的 Schema )

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

或者这样

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

阻止元素替换

为防止其它的元素替换某个指定的元素,可以使用 block 属性

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

请看某个 XML schema 的片段

<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 文档应该类似这样(根据上面的 XML Schema)

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

但是下面的 XML 文档不再合法

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

使用 substitutionGroup 属性

可替换元素的类型必须和主元素相同,或者从主元素衍生而来

假如可替换元素的类型与主元素的类型相同,那么我们可以不必规定可替换元素的类型

需要注意的是 substitutionGroup 中的所有元素(主元素和可替换元素)必须被声明为全局元素,否则就无法工作

什么是全局元素 ?

全局元素指 "schema" 元素的直接子元素

本地元素(Local elements)指嵌套在其它元素中的元素

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.