Заменяемость элементов (Element Substitution) XSD

С помощью XML Schema один элемент может заменить другой.

Замена элементов

Давайте рассмотрим пример: наши пользователи приходят из Великобритании и Норвегии. Мы хотим иметь возможность позволить пользователям выбирать, использовать ли в документе XML элементарные имена на норвежском или английском языке.

Чтобы решить эту проблему, мы можем определить один в XML schema. substitutionGroupСначала мы объявляем основной элемент, затем мы объявляем вторичные элементы, которые могут заявить, что они могут заменить основной элемент.

<xs:element name="name" type="xs:string"/>
<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"/>

Правильный XML-документ должен выглядеть примерно так (в соответствии с вышеуказанным схемой):

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

или что-то подобное:

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

Правильный XML-документ должен выглядеть примерно так (в соответствии с вышеуказанным схемой):

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

Но следующий документ больше не合法:

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

Использование substitutionGroup

Тип заменяемого элемента должен быть таким же, как и у главного элемента, или производиться из него. Если тип заменяемого элемента такой же, как и у главного элемента, то определять тип заменяемого элемента не нужно.

Обратите внимание, что все элементы в substitutionGroup (основные элементы и элементы, подлежащие замене) должны быть объявлены в качестве глобальных элементов, в противном случае они не будут работать!

Что такое глобальные элементы (Global Elements)?

Глобальные элементы указывают на прямых детей элемента "schema"! Локальные элементы (Local elements) указывают на элементы, вложенные в другие элементы.