XSD 要素置換(Element Substitution)
XML Schema を使用すると、ある要素を別の要素に置き換えることができます。
要素置換
例で説明しましょう。ユーザーはイギリスとノルウェーから来ています。XML 文書でノルウェー語の要素名を使用するか、英語の要素名を使用するかをユーザーが選択できるようにしたいとします。
この問題を解決するために、XML スキーマで定義することができます。substitutionGroupまず、主要素を宣言し、次に副要素を宣言します。これらの副要素は、主要素を置き換えられることを宣言できます。
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
<xs:element name="navn" substitutionGroup="name"/>
上記の例では、"name" 要素が主要素であり、"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"/>
<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>
<name>John Smith</name>
</customer>
または次のようになります:
<kunde>
<navn>John Smith</navn>
</kunde>
<navn>John Smith</navn>
</kunde>
要素置換の防止
他の要素が指定された要素を置き換えるのを防ぐには、block 属性を使用します:
<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"/>
<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>
<name>John Smith</name>
</customer>
しかし、次の文書はもはや妥当ではありません:
<kunde>
<navn>John Smith</navn>
</kunde>
<navn>John Smith</navn>
</kunde>
substitutionGroup を使用する
置換可能な要素の型は、主要素と同じか、主要素から派生したものでなければなりません。置換可能な要素の型が主要素の型と同じ場合は、置換可能な要素の型を指定する必要はありません。
substitutionGroup 内のすべての要素(主要素と置換可能な要素)は、グローバル要素として宣言されなければならないことに注意してください。そうしないと機能しません!
グローバル要素(Global Elements)とは?
グローバル要素とは、"schema" 要素の直接の子要素のことです!ローカル要素(Local elements)とは、他の要素内にネストされた要素のことです。
その他の拡張