XSD要素の置換
XMLスキーマを使用すると、ある要素を別の要素に置き換えることができます。
元素置換
イギリスとノルウェーの2つの異なる国からのユーザーがいるとしましょう。XMLドキュメントでノルウェーの要素名と英語の要素名のどちらを使用するかをユーザーが選択できるようにする機能が必要です。
この問題を解決するために、XMLスキーマでsubstitutionGroupを定義できます。最初にhead要素を宣言し、次にhead要素の代わりに使用できることを示す他の要素を宣言します。
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
上記の例では、「name」要素はhead要素であり、「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ドキュメント(上記のスキーマによる)は次のようになります。
<customer>
<name>John Smith</name>
</customer>
またはこのように:
<kunde>
<navn>John Smith</navn>
</kunde>
ブロッキング要素の置換
他の要素が指定された要素に置き換えられないようにするには、ブロック属性を使用します。
<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ドキュメント(上記のスキーマによる)は次のようになります。
<customer>
<name>John Smith</name>
</customer>
しかし、これはもはや有効ではありません:
<kunde>
<navn>John Smith</navn>
</kunde>
substitutionGroupを使用する
置換可能な要素のタイプは、head要素のタイプと同じであるか、それから派生している必要があります。代替可能要素のタイプがヘッド要素のタイプと同じである場合、代替可能要素のタイプを指定する必要はありません。
substitutionGroup内のすべての要素(head要素とsubstituable要素)はグローバル要素として宣言する必要があることに注意してください。そうしないと機能しません。
グローバル要素とは何ですか?
グローバル要素は、「スキーマ」要素の直接の子である要素です。ローカル要素は、他の要素内にネストされた要素です。