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


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


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

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

Чтобы решить эту проблему, мы можем определить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 должны быть объявлены как глобальные элементы, иначе это не сработает!


Что такое глобальные элементы?

Глобальные элементы являются непосредственными дочерними элементами элемента "schema"! Локальные элементы — это элементы, вложенные в другие элементы.

Другие расширения