XML Schema 元素替換
XSD 元素替換(Element Substitution)
透過 XML Schema,一個元素可對另一個元素進行替換。
元素替換
讓我們舉例:我們的用戶來自英國和挪威。我們希望有能力讓使用者選擇在 XML 文件中使用挪威語的元素名稱還是英語的元素名稱。
為了解決這個問題,我們可以在 XML schema 中定義一個 substitutionGroup。首先,我們聲明主元素,然後我們會聲明次元素,這些次元素可聲明它們能夠替換主元素。
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
<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"/>
<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>
<kunde>
<name>John Smith</name>
</customer>
##或類似這樣:</customer>
<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"/>
< ;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 文件應該類似這樣(根據上面的schema):
< ;customer>
<name>John Smith</name>
</customer>
<name>John Smith</name>
</customer>
<navn>John Smith</navn>
</kunde>
使用substitutionGroup
#可替換元素的類型必須和主元素相同,或從主元素衍生而來。假如可替換元素的類型與主元素的類型相同,那麼您就不必規定可替換元素的類型了。
請注意,substitutionGroup 中的所有元素(主元素和可替換元素)必須宣告為全域元素,否則就無法運作!
什麼是全域元素(Global Elements)?