
- •Лекция 4-04
- •4.2.7. Объявление атрибутов в схеме xml
- •4.2.7.1. Формат элементаattribute
- •4.2.7.2. Встроенные объявления атрибутов
- •4.2.8. Объявление элементов в схемеXml
- •4.2.8.1. Формат объявления элементаelement
- •4.2.8.2. Элементыunique,selectorиfield
- •4.2.8.3. Элементыkeyиkeyref
- •4.2.9. Определение комплексного типа в схемеXml
- •4.2.9.1. Формат определения элементаcomplexType
- •4.2.9.2. Элементы sequence, any, choice, all и group
- •4.2.9.3. ЭлементыattributeGroupиanyAttribute
- •4.2.9.4. ЭлементsimpleContent
- •4.2.9.5. ЭлементcomplexContent
- •4.2.10. Объявление нотации в схемеXml
- •4.2.11. Структура схемы
- •4.2.11.1. Элементschema
- •4.2.11.2. Включение внешних фрагментов в схему
- •4.2.11.3. Включение схемы в документXml
4.2.8.3. Элементыkeyиkeyref
Элемент keyопределяет значение атрибута или элемента как ключ (ненулевой, уникальный и всегда присутствующий) в содержащем элементе формируемого документа. Элемент имеет следующий формат:
<префикс:key
id = ID
name = NCName
>
(annotation?, (selector, field+))
</префикс:key>
Атрибуты idиnameимеют тот же смысл, что и для элементаunique.
Пример использования элементов key, selector и field:
<xs:key name="fullName">
<xs:selector xpath=".//person"/>
<xs:field xpath="forename"/>
<xs:field xpath="surname"/>
</xs:key>
В этом примере поля "forename" и"surname" используются в качестве ключа с именемfullName.
Элемент keyrefопределяет, что значение атрибута или элемента соответствует значениям заданного ключа или уникального элемента и имеет следующий формат:
<префикс:keyref
id = ID
name = NCName
refer = QName
>
(annotation?, (selector, field+))
</префикс:keyref>
Атрибуты idиnameимеют тот же смысл, что и для элементаunique, а обязательный атрибутreferопределяет имя ключа или уникального элемента, определенного в данной или другой схеме.
Пример использования элементов keyref, selector и field:
<xs:keyref name="personRef" refer="fullName">
<xs:selector xpath=".//personPointer"/>
<xs:field xpath="@first "/>
<xs:field xpath="@last"/>
</xs:keyref>
В этом примере поля "@first" и"@last" соответствуют значениям ключа определенного выше элемента с именемfullName.
4.2.9. Определение комплексного типа в схемеXml
Комплексный элемент типа complexType– это элементXML, содержащий другие элементы и/или атрибуты. Существует четыре вида комплексных элементов:
пустые элементы;
элементы, содержащие только другие элементы;
элементы, содержащие только текст;
элементы, содержащие и другие элементы, и текст.
4.2.9.1. Формат определения элементаcomplexType
Определение комплексного типа имеет следующий формат:
<префикс:complexType
name = NCName
id = ID
abstract = boolean : false
mixed = boolean : false
block = (#all| List(extension | restriction))
final = (#all | List(extension | restriction))
>
(annotation?, (simpleContent | complexContent |
((sequence | group | all | choice)?,
((attribute | attributeGroup)*, anyAttribute?))))
</префикс:complexType>
Атрибуты nameиidв элементеcomplexTypeимеют тот же смысл, что и в элементеattribute, а атрибуты abstract, block и final – тот же смысл, что и в элементе element. Атрибут mixed определяет, могут ли символьные данные появляться между дочерними элементами определения комплексного типа.
Как видно из определения комплексного типа, для этого элемента может быть задан один из следующих вариантов содержимого:
элемент simpleContent;
элемент complexContent;
один из элементов group, all, choice или sequence (0 или 1 раз), один из элементов attribute или attributeGroup (0 и более раз) и элемент anyAttribute (0 или 1 раз).
Рассмотрим дочерние элементы элемента complexType.
4.2.9.2. Элементы sequence, any, choice, all и group
Элемент sequenceопределяет, что дочерние элементы данного элемента должны появляться в заданной последовательности и имеет следующий формат:
<префикс:sequence
id = ID
maxOccurs = (nonNegativeInteger | unbounded) : 1
minOccurs = nonNegativeInteger : 1
>
(annotation?, (element | group | choice | sequence | any)*)
</префикс:sequence>
Необязательный атрибут idзадает уникальный идентификатор элемента, а необязательные атрибутыmaxOccursиminOccursзадают максимальное и минимальное значение для количества включений данной последовательности в родительский элемент.
Пример использования элемента sequence:
<xs:element name="personinfo">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="child" type="xs:string"/>
</xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>
В примере задан элемент с именем personinfo(данные о сотруднике). Этот элемент содержит дочерние элементыfirstnameиlastname, а также последовательность элементовchild(ребенок) – эта последовательность может отсутствовать или содержать неограниченное количество элементовchild.
Как видно, из объявления элемента sequence, в содержимом этого элемента может быть задан дочерний элементany. Этот элемент позволяет расширить документXMLэлементами, которые не определены в схеме, и имеет следующий формат:
<префикс:any
id = ID
maxOccurs = (nonNegativeInteger | unbounded) : 1
minOccurs = nonNegativeInteger : 1
namespace = ((##any | ##other) | List (anyURI |
(##targetNamespace | ##local))) : ##any
processContents = (strict | lax | skip) : strict
>
(annotation?)
</префикс:any>
Необязательный атрибут idзадает уникальный идентификатор элемента, а необязательные атрибутыmaxOccursиminOccursзадают максимальное и минимальное значение для количества включений элементаanyв родительский элемент. Необязательный атрибутnamespaceопределяет пространства имен, содержащих элементы, которые могут быть использованы в родительском элементе, и может иметь одно из следующих значений:
##any – допустимы элементы из любого пространства имен;
##other– могут присутствовать элементы из любого пространства имен, отличного от пространства имен, заданного для родительского элемента;
##local– элементы должны задаваться не из пространства имен;
##target Namespace– могут присутствовать элементы из пространства имен, заданного для родительского элемента;
List(anyURI| (##targetNamespace |##local))) – могут присутствовать элементы из заданного списка.
Необязательный атрибут processContentsопределяет, как процессорXMLдолжен организовать обработку элементов, определенных данным элементомanyи может иметь одно из следующих значений:
strict– процессорXMLдолжен получить схему необходимых пространств имен и проверить действительность элементов;
lax– аналогичноstrict, но если схема не может быть получена, сообщение об ошибке не генерируется;
skip– процессорXMLпропускает проверку действительности элементов.
Пример использования элемента any:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:any minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
С помощью использования элемента anyможно расширить содержимое элементаperson(после элементаlastname) любым другим элементом.
Элемент choiceразрешает задавать в родительском элементе только один из присутствующих в списке элементов и имеет следующий формат:
<префикс:choice
id = ID
maxOccurs = (nonNegativeInteger | unbounded) : 1
minOccurs = nonNegativeInteger : 1
>
(annotation?, (element | group | choice | sequence | any)*)
</префикс:choice>
Необязательный атрибут idзадает уникальный идентификатор элемента, а необязательные атрибутыmaxOccursиminOccursзадают максимальное и минимальное значение для количества включений выбранного элемента в родительский элемент.
Пример использования элемента choice:
<xs:element name="employee">
…
</xs:element>
<xs:element name="freelance">
…
</xs:element>
…
<xs:element name="person">
<xs:complexType>
<xs:choice>
<xs:element ref="employee"/>
<xs:element ref="freelance"/>
</xs:choice>
</xs:complexType>
</xs:element>
Элемент personдолжен содержать один из описанных ранее элементов:employee(постоянный сотрудник) илиfreelance (контрактник).
Элемент allопределяет, что элементы, содержащийся в нем, могут появляться в родительском элементе в любом порядке, и каждый элемент может появляться 0 или 1 раз. Элемент имеет следующий формат:
<префикс:all
id = ID
maxOccurs = 1 : 1
minOccurs = (0 | 1) : 1
>
(annotation?, element*)
</префикс:all>
Необязательный атрибут idзадает уникальный идентификатор элемента. Необязательный атрибутmaxOccursдолжен иметь значение 1, а необязательный атрибутminOccursзадает минимальное значение для количества включений выбранного элемента в родительский элемент (0или1).
Пример использования элемента all:
<xs:element name="person">
<xs:complexType>
<xs:all minOccurs="0">
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
Элементы firstnameиlastnameмогут появляться в элементе в элементеpersonв любом порядке и один или оба элемента могут отсутствовать.
Элемент groupиспользуется для задания группы элементов в определении комплексного типа и имеет следующий формат:
<префикс:group
id = ID
name = NCName
ref = QName
maxOccurs = nonNegativeInteger | unbounded : 1
minOccurs = nonNegativeInteger : 1
>
(annotation?, (all | choice | sequence))
</префикс:group>
Атрибут name задает имя элемента. Он является обязательным только в том случае, если родительским элементом данного элемента является элементschemaили элементredefine. Атрибутrefзадает ссылку на имя другой группы (атрибутыnameиrefявляются взаимоисключающими). Необязательные атрибутыmaxOccursиminOccursзадают максимальное и минимальное значение для количества включений элементов группы в родительский элемент.
Пример использования элемента group:
<xs:group name="custGroup">
<xs:sequence>
<xs:element name="customer" type="xs:string"/>
<xs:element name="orderDetails" type="xs:string"/>
</xs:sequence>
</xs:group>
…
<xs:element name="order" type="orderType"/>
<xs:complexType name="orderType">
<xs:group ref="custGroup"/>
<xs:attribute name="status" type="xs:string"/>
</xs:complexType>
В этом примере определена группа custGroup, состоящая из двух элементов:customer(покупатель) иorderDetails(детали заказа), а затем эта группа использована (с помощью ссылки) в определении комплексного типа orderType.