С помощью XML-схемы, один элемент может заменить другой элемент.
Элемент Замена
Давайте предположим, что у нас есть пользователи из двух разных стран: Англии и Норвегии. Мы хотели бы возможность позволить пользователю выбрать, будет ли он или она хотела бы использовать норвежские имена элементов или имена английских элементов в документе XML.
Чтобы решить эту проблему, мы могли бы определить substitutionGroup в схеме XML. Во-первых, мы объявляем элемент головки, а затем мы объявляем другие элементы которые утверждают, что они являются взаимозаменяемыми для элемента головки.
<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 (according to the schema above) в (according to the schema above) может выглядеть следующим образом :
<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 (according to the schema above) в (according to the schema above) выглядит следующим образом :
<customer>
<name>John Smith</name>
</customer>
НО ЭТО НЕ ДОЛЬШЕ ДЕЙСТВИТЕЛЕН:
<kunde>
<navn>John Smith</navn>
</kunde>
Использование substitutionGroup
Тип замещаемых элементов должны быть такими же, как, или полученный из, типа головного элемента. Если тип замещаемого элемента является такой же, как от типа головного элемента вы не должны указывать тип замещаемых элемента.
Обратите внимание, что все элементы в substitutionGroup (головной элемент и замещаемые элементы) должны быть объявлены как глобальные элементы, в противном случае она не будет работать!
Какие глобальные элементы?
Глобальные элементы являются элементами , которые являются непосредственными потомками "schema" элемент! Локальные элементы представляют собой элементы, вложенные в другие элементы.