XSD 元素替換(Element Substitution)
在 XML Schema,如果想指定某個(gè)元素可替代另一個(gè)元素,可為該元素增加 substitutionGroup 屬性,屬性值是該元素想要替換的元素名字。
通過(guò) XML Schema,一個(gè)元素可對(duì)另一個(gè)元素進(jìn)行替換。
元素替換
讓我們舉例說(shuō)明:我們的用戶來(lái)自英國(guó)和挪威。我們希望有能力讓用戶選擇在 XML 文檔中使用挪威語(yǔ)的元素名稱還是英語(yǔ)的元素名稱。
為了解決這個(gè)問題,我們可以在 XML schema 中定義一個(gè) substitutionGroup。首先,我們聲明主元素,然后我們會(huì)聲明次元素,這些次元素可聲明它們能夠替換主元素。
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
在上面的例子中,"name" 元素是主元素,而 "navn" 元素可替代 "name" 元素。
請(qǐng)看一個(gè) 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 文檔類似這樣(根據(jù)上面的 schema):
<customer>
<name>John Smith</name>
</customer>
或類似這樣:
<kunde>
<navn>John Smith</navn>
</kunde>
XML Schema 元素替換注意事項(xiàng):
1、替換元素和被替換元素都必須使用全局元素來(lái)聲明;
2、替換元素與被替換元素要么有相同的數(shù)據(jù)類型,要么替換元素類型是被替換元素類型的派生類型。
阻止元素替換
為防止其他的元素替換某個(gè)指定的元素,請(qǐng)使用 block 屬性:
<xs:element name="name" type="xs:string" block="substitution"/>
請(qǐng)看某個(gè) 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 文檔應(yīng)該類似這樣(根據(jù)上面的 schema):
<customer>
<name>John Smith</name>
</customer>
但是下面的文檔不再合法:
<kunde>
<navn>John Smith</navn>
</kunde>
使用 substitutionGroup
可替換元素的類型必須和主元素相同,或者從主元素衍生而來(lái)。假如可替換元素的類型與主元素的類型相同,那么您就不必規(guī)定可替換元素的類型了。
請(qǐng)注意,substitutionGroup 中的所有元素(主元素和可替換元素)必須被聲明為全局元素,否則就無(wú)法工作!
什么是全局元素(Global Elements)?
全局元素指 "schema" 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。
更多建議: