До сих пор мы
имели возможность получать новые типы и использовать их в документах примера
без каких-либо ограничений. В действительности, авторы схем иногда хотят
управлять происхождением отдельных типов, и использовать полученные типы в
примерах.
XML Schema обеспечивает несколько механизмов,
которые управляют происхождением типов. Один из этих механизмов позволяет
автору схемы определять, какие новые типы не могут быть получены из
определенного сложного типа: (a)
посредством ограничения, (b) посредством расширения, (c) обоими способами. Для
того чтобы это проиллюстрировать, предположим следующее. Мы хотим предотвратить
какое-либо образование из типа Address
посредством ограничения, поскольку мы хотели бы, чтобы он только
использовался как основа для расширенных типов, таких как USAddress и UKAddress. Чтобы предотвратить такого рода образования, мы, следующим
образом, немного изменим первоначальное определение Address
:
<complexType name=”Address” final=”restriction”> <sequence> <element name=”name” type=”string”/> <element name=”street” type=”string”/> <element name=”city” type=”string”/> </sequence> </complexType>
Значение restriction
атрибута final
предотвращает образование посредством
ограничения. Предотвращение образований вообще, или посредством расширения,
обозначено значениями #all и extension,
соответственно. Кроме того, существует дополнительный атрибут finalDefault
в элементе schema
, значение которого может быть одним из
значений, разрешенных для атрибута final
. Эффект определения атрибута finalDefault
эквивалентен в схеме определению атрибута final
в каждом определении типов и объявлении
элемента.
Другой механизм образования типа
управляет тем, какие ограничения могут
быть применены при образовании нового простого типа. Когда простой тип
определен, атрибут fixed
может быть применен к любому из его
ограничений, чтобы предотвратить образование этого типа, посредством изменения
значения фиксированных ограничений. Например, мы можем определить простой тип Postcode
как:
<simpleType name=”Postcode”> <restriction base=”string”> <length value=”7” fixed=”true”/> </restriction> </simpleType>
Как только этот простой тип был
определен, мы можем получить новый тип почтового кода, в котором мы применили
ограничения, не фиксированные в основном определении, например:
<simpleType name="UKPostcode"> <restriction base=”ipo:Postcode”> <pattern value=”[A-Z]{2}\d\s\d[A-Z]{2}”/> </restriction> </simpleType>
Однако мы не можем получить
новый почтовый код, в котором мы повторно применяем какое-либо ограничение,
которое было фиксировано в основном определении:
<simpleType name=”UKPostcode”> <restriction base=”ipo:Postcode”> <pattern value=”[A-Z]{2}\d\d[A-Z]{2}”/> <!-- illegal attempt to modify facet fixed in base type --> <length value=”6” fixed=”true”/> </restriction> </simpleType>
В дополнение к
механизмам, управляющим образованиями типов, XML Schema обеспечивают механизм, который управляет
тем, какие образования и группы замены могут использоваться в документах
примера. В Разделе 4.3, мы описали как образованные типы, USAddress и UKAddress, могли использоваться элементами shipTo и billTo в
документах примера. Эти производные типы могут заменить модель содержания,
обеспеченную типом Address
,
поскольку они получены из типа Address
. Однако, замещение производными типами может управляться,
используя атрибут block
в определении типа. Например, если мы
хотим блокировать какое-либо образование-посредством-ограничения, которое могло
бы использоваться для замены Address
(возможно по той же самой причине мы определили Address
с final="
restriction"
), то необходимо изменить первоначальное определение Address
следующим образом:
<complexType name=”Address” block=”restriction”> <sequence> <element name=”name” type=”string”/> <element name=”street” type=”string”/> <element name=”city” type=”string”/> </sequence> </complexType>
В примере значение restriction
в атрибуте block
препятствует использованию
образования-посредством-ограничения для замены Address
. Однако это не предотвратило бы замену Address
на
UKAddress и USAddress, поскольку они были получены расширением.
В любом случае предотвращение замены образованиями или
образованиями-посредством-расширения, обозначается значениями #all и extension,
соответственно. Как с final
, там существует дополнительный атрибут blockDefault
в элементе schema
, значение которого может быть одним из
значений, разрешенных для атрибута block
. Эффект определения атрибута blockDefault
эквивалентен определению атрибута block
в
каждом определении типа и объявлении элемента в схеме.