XSD 元素替换(Element Substitution)

Melalui XML Schema, satu elemen dapat menggantikan elemen lain.

Penggantian Elemen

Jadilah contoh: pengguna kami berasal dari Inggris dan Norwegia. Kami ingin mempunyai kemampuan untuk memilih penggunaan nama elemen berbahasa Norwegia atau Inggris dalam dokumen XML.

Untuk memecahkan masalah ini, kami dapat mendefinisikan satu substitutionGroupDahulu, kami menyatakan elemen utama, kemudian kami akan menyatakan elemen sekunder, elemen sekunder ini dapat menyatakan bahwa mereka dapat menggantikan elemen utama.

<xs:element name="name" type="xs:string"/>
<xs:element name="navn"}} substitutionGroup="name"/>

Dalam contoh di atas, elemen "name" adalah elemen utama, sementara elemen "navn" dapat menggantikan elemen "name".

Lihat bagian skema XML yang ada:

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

Dokumen XML yang sah seperti ini (sesuai skema di atas):

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

atau seperti ini:

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

Mencegah penggantian elemen

Untuk mencegah elemen lain menggantikan elemen yang ditentukan, gunakan atribut block:

<xs:element name="name" type="xs:string"> block="substitution"/>

Lihat bagian skema XML yang ada:

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

Dokumen XML yang sah seharusnya seperti ini (sesuai skema di atas):

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

tetapi dokumen di bawah ini tidak sah lagi:

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

guna substitutionGroup

jenis elemen yang dapat digantikan mesti sama dengan elemen utama, atau berasal dari elemen utama. Jika jenis elemen yang dapat digantikan sama dengan jenis elemen utama, maka anda tidak perlu menentukan jenis elemen yang dapat digantikan.

请注意,substitutionGroup 中的所有元素(主元素和可替换元素)必须被声明为全局元素,否则就无法工作!

什么是全局元素(Global Elements)?

全局元素指 "schema" 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。