XSD Замена элементов
С помощью XML Schema один элемент может заменять другой элемент.
Замена элементов
Проиллюстрируем: наши пользователи из Великобритании и Норвегии. Мы хотим дать пользователям возможность выбирать, использовать ли норвежские имена элементов или английские имена элементов в XML-документах.
Чтобы решить эту проблему, мы можем определитьsubstitutionGroup. Сначала мы объявляем главный элемент, затем объявляем вторичные элементы, которые могут объявить, что они могут заменять главный элемент.
<xs:element name="navn" substitutionGroup="name"/>
В приведенном выше примере элемент "name" является основным элементом, а элемент "navn" может заменить элемент "name".
Ниже приведен фрагмент XML-схемы:
<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-документ будет выглядеть так (в соответствии с приведенной выше схемой):
<name>John Smith</name>
</customer>
Или так:
<navn>John Smith</navn>
</kunde>
Блокирование подстановки элементов
Чтобы другие элементы не могли подставляться вместо указанного элемента, используйте атрибут block:
Ниже приведен фрагмент XML-схемы:
<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-документ должен выглядеть так (в соответствии с приведённой выше схемой):
<name>John Smith</name>
</customer>
Но следующий документ уже недействителен:
<navn>John Smith</navn>
</kunde>
Использование substitutionGroup
Тип подставляемого элемента должен совпадать с типом основного элемента или быть производным от основного элемента. Если тип подставляемого элемента совпадает с типом основного элемента, то указывать тип подставляемого элемента не нужно.
Обратите внимание, что все элементы (основной элемент и подставляемые элементы) в substitutionGroup должны быть объявлены как глобальные элементы, иначе это не сработает!
Что такое глобальные элементы?
Глобальные элементы являются непосредственными дочерними элементами элемента "schema"! Локальные элементы — это элементы, вложенные в другие элементы.
Другие расширения