XSD 要素置換(Element Substitution)

XMLスキーマを通じて、1つの要素は別の要素を置き換えることができます。

要素置き換え

例を示します:ユーザーはイギリスやノルウェイから来ています。ユーザーがXMLドキュメントでノルウェイ語の要素名を使用するか、英語の要素名を使用するかを選択できるようにする必要があります。

この問題を解決するために、XMLスキーマで定義することができます。 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"/>

有效的 XML 文档类似这样(根据上面的 schema):

<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"/>

合法的 XML 文档应该类似这样(根据上面的 schema):

<customer>
  <name>John Smith</name>
</customer>

但是下面的文档不再合法:

<kunde>
  <navn>John Smith</navn>
</kunde>

使用 substitutionGroup

可替换元素的类型必须和主元素相同,或者从主元素衍生而来。假如可替换元素的类型与主元素的类型相同,那么您就不必规定可替换元素的类型了。

substitutionGroup内のすべての要素(メイン要素と可置換要素)は、動作するために必ずグローバル要素として宣言する必要があります。それがなければ動作しません!

グローバル要素(Global Elements)とは何ですか?

グローバル要素は「schema」要素の直接子要素を指します!ローカル要素(Local elements)は他の要素に埋め込まれた要素を指します。