XSD 元素替換
使用 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"/>
根據上面的 Schema,一個有效的 XML 文件可以看起來像這樣
<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"/>
根據上面的 Schema,一個有效的 XML 文件看起來像這樣
<customer>
<name>John Smith</name>
</customer>
但這不再有效
<kunde>
<navn>John Smith</navn>
</kunde>
使用 substitutionGroup
可替換元素的型別必須與頭元素的型別相同或派生自頭元素的型別。如果可替換元素的型別與頭元素的型別相同,則無需指定可替換元素的型別。
請注意,substitutionGroup 中的所有元素(頭元素和可替換元素)都必須宣告為全域性元素,否則將不起作用!
什麼是全域性元素?
全域性元素是“schema”元素的直接子元素!區域性元素是巢狀在其他元素內的元素。