XML Schema обеспечивает
механизм усиливающий замену для отдельных элементов или типов. Когда элемент
или тип объявлен как " abstract ", он не может использоваться в
документе примера. Когда элемент объявлен как абстрактный, член той группы
замены элемента должен представляться в документе. Когда соответствующее
определение типа элемента
объявлено как абстрактное,
все образцы этого элемента должны использовать xsi:type,
для того, чтобы
указать производный
тип, который является не абстрактным.
В примере группы замены,
описанной нами в Разделе 4.6, могло бы быть полезным запретить
использование элемента comment
, чтобы в тех примерах обязать использовать элементы customerComment и shipComment. Для того чтобы объявить comment
как абстрактный элемент, мы изменим его
первоначальное объявление в схеме международного счета на покупку, ipo.xsd
, следующим образом:
<element name=”comment” type=”string” abstract=”true”/>
При объявлении comment
абстрактным, примеры международных
счетов на покупки теперь только тогда правильные, когда они содержат элементы customerComment и shipComment.
Объявление элемента
абстрактным требует использования группы
замены. Объявление типа абстрактным просто требует использования типа,
полученного от него в документе примера (и идентифицируется атрибутом xsi:type
). Рассмотрим следующее определение
схемы:
<schema xmlns=”http://w3.org.ru/2001/XMLSchema" targetNamespace=”http://cars.example.com/schema" xmlns=”href="http://cars.example.com/schema"> <complexType name=”Vehicle” abstract=”true”/> <complexType name=”Car”> <complexContent> <extension base=”target:Vehicle”/> </complexContent> </complexType> <complexType name=”Plane”> <complexContent> <extension base=”target:Vehicle”/> </complexContent> </complexType> <element name=”transport” type=”target:Vehicle”/> </schema>
Элемент transport
не абстрактый, поэтому он может появиться
в документах примера. Однако, поскольку его тип определен как абстрактный, он
никогда не сможет появляться в документе примера без атрибута xsi:type
, который ссылается к производному типу.
Это означает, что следующая схема не правильная:
<transport xmlns=”http://cars.example.com/schema”/>
поскольку тип элемента transport
абстрактный. Однако, следующая схема
правильная:
<transport xmlns=”href="http://cars.example.com/schema" xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance"> xsi:type=”Car”/>
поскольку она использует не
абстрактный тип, который является заменяемым для Vehicle
.