4.8 Управление созданием и использованием полученными типами

До сих пор мы имели возможность получать новые типы и использовать их в документах примера без каких-либо ограничений. В действительности, авторы схем иногда хотят управлять происхождением отдельных типов, и использовать полученные типы в примерах.

XML Schema обеспечивает несколько механизмов, которые управляют происхождением типов. Один из этих механизмов позволяет автору схемы определять, какие новые типы не могут быть получены из определенного сложного типа:  (a) посредством ограничения, (b) посредством расширения, (c) обоими способами. Для того чтобы это проиллюстрировать, предположим следующее. Мы хотим предотвратить какое-либо образование из типа Address посредством ограничения, поскольку мы хотели бы, чтобы он только использовался как основа для расширенных типов, таких как  USAddress и UKAddress. Чтобы предотвратить такого рода образования, мы, следующим образом, немного изменим первоначальное определение Address:

Предотвращение образования посредством ограничения 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>

Как только этот простой тип был определен, мы можем получить новый тип почтового кода, в котором мы применили ограничения, не фиксированные в основном определении, например:

Правильное образование от Postcode

<simpleType name="UKPostcode">
 <restriction base=”ipo:Postcode”>
  <pattern value=”[A-Z]{2}\d\s\d[A-Z]{2}”/>
 </restriction>
</simpleType>

Однако мы не можем получить новый почтовый код, в котором мы повторно применяем какое-либо ограничение, которое было фиксировано в основном определении:

Неправильное образование от Postcode

<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 следующим образом:

Предотвращение образования посредством ограничения 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  в каждом определении типа и объявлении элемента в схеме.

 


Охотник.спб.ру | erodream.ru/ | Доминфо | Логотипы | Софт | Студпортал |
Используются технологии uCoz