В дополнение к способу получения
новых сложных типов посредством расширения модели содержания, можно получить
новые типы, ограничивая модели содержания существующих типов. Ограничение
сложных типов концептуально подобно ограничению простых типов. Отличие в том,
что более предпочтительно основывать ограничение сложных типов за счет
включения объявлений типов, а не допустимых диапазонов значений, как для
простых типов. Сложный тип, полученный посредством ограничения очень похож на
исходный тип, за исключением того, что его объявления больше ограничены, чем
соответствующие объявления в исходном типе. Фактически, значения,
представленные новым типом являются подмножеством значений, представленных
исходным типом (как и в случае с ограничением простых типов). Другими словами,
приложение, которое понимает значения исходного типа, нормально будет
воспринимать и значения с ограниченным типом.
Например, предположим, что мы
хотим модифицировать наше определение списка items
в международном счете на покупку так,
чтобы он мог содержать, по крайней мере,
один item
в счете. Схема, показанная в ipo.xsd,
позволяет
элемент items
представлять без каких-либо дочерних
элементов item
. Для того
чтобы создавать наш новый тип ConfirmedItems, мы определяем новый тип обычным
образом, указываем, что он получен посредством ограничения от исходного типа Items
, и обеспечиваем новое (с более сильным
ограничением) значение для минимального количества появляющихся элементов item
. Обратите внимание, что типы, полученные
посредством ограничения должны повторять все компоненты определения исходного
типа, которые включаются в наследуемый тип:
<complexType name=”ConfirmedItems”> <complexContent> <restriction base=”ipo:Items”> <sequence> <!-- item element is different than in Items --> <element name=”item” minOccurs=”1” maxOccurs=”unbounded”> <!-- remainder of definition is same as Items --> <complexType> <sequence> <element name=”productName” type=”string”/> <element name=”quantity”> <simpleType> <restriction base=”positiveInteger”> <maxExclusive value=”100”/> </restriction> </simpleType> </element> <element name=”USPrice” type=”decimal”/> <element ref=”ipo:comment” minOccurs=”0”/> <element name=”shipDate” type=”date” minOccurs=”0”/> </sequence> <attribute name=”partNum” type=”ipo:SKU” use=”required”/> </complexType> </element> </sequence> </restriction> </complexContent> </complexType>
Это изменение, требуемое, по
крайней мере, для одного дочернего элемента, сужает допустимое количество
дочерних элементов от минимума, равного 0, к минимуму, равному 1, является
более предпочтительным, чем допускать ноль или несколько дочерних элементов.
Отметим, что все элементы типа ConfirmedItems также
будут приемлемы как элементы типа Item
.
Далее проиллюстрируем это
ограничение. В Таблице 3 показы
несколько примеров того, как объявления элементов и атрибутов внутри
определений типов могут быть ограничены (в таблице показан синтаксис элементов,
первые три примера являются одинаковыми
с точки зрения правильности ограничений атрибутов).
Основа |
Ограничение |
Замечания |
|
default="1" |
задание
значения по умолчанию, в случае, когда ничего предварительно не было
определено |
|
fixed="100" |
задание фиксированного
значения, в случае, когда ничего предварительно не было определено |
|
type="string" |
задание типа, в
случае, когда ничего предварительно не было определено |
|
||
(0, 1) |
(0, 0) |
исключение
дополнительной компоненты; это может также быть достигнуто, опуская объявление компоненты от
ограниченного определения типа |
(0, неограниченно) |
(0, 0) (0, 37) |
|
(1, 9) |
(1, 8) (2, 9) (4, 7) (3, 3) |
|
(1, неограниченно) |
(1, 12) (3, неограниченно) (6, 6) |
|
(1, 1) |
- |