Замена элемента XSD
В XML-схемах один элемент может заменить другой элемент.
Замена элемента
Допустим, у нас есть пользователи из двух разных стран: Англии и Норвегии. Нам бы хотелось, чтобы пользователь мог выбирать, будет ли он или она использовать норвежские имена элементов или английские имена элементов в XML-документе.
Чтобы решить эту проблему, мы могли бы определить группу замещения в схеме XML. Сначала мы объявляем элемент head, а затем объявляем другие элементы, в которых указано, что они могут быть заменены элементом head.
<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>
Замена блокирующего элемента
Чтобы другие элементы не замещались указанным элементом, используйте атрибут блока:
<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 (головной элемент и замещаемые элементы) должны быть объявлены как глобальные элементы, иначе это не сработает!
Что такое глобальные элементы?
Глобальные элементы — это элементы, которые являются непосредственными дочерними элементами элемента «схема»! Локальные элементы — это элементы, вложенные в другие элементы.