</advert>
Определению элемента соответствует EBNF-продукция elementdecl
:
[45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>'
Нетерминал contentspec
, следующий через пробельное пространство за именем элемента, определяет тип содержимого, которое может иметь этот элемент:
[46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children
Строка 'EMPTY
' соответствует пустому элементу, 'ANY
' — любому содержимому, нетерминал Mixed
— смешанному содержимому, children
— содержимому, которое определяется формальными правилами.
[47] children ::= (choice | seq) ('?' | '*' | '+')?
[48] cp ::= (Name | choice | seq) ('?' | '*' | '+')?
[49] choice ::= '(' S? cp ( S? '|' S? cp )+ S? ')'
[50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')'
[51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'
| '(' S? '#PCDATA' S? ')'
Определение списка атрибутов
Список атрибутов некоторого элемента задается следующим образом:
<!ATTLIST
В этом определении
задает имя элемента, для которого определяется данный список атрибутов,
— имя атрибута,
— тип атрибута и
— значение атрибута.
атрибута отвечает в XML тем же самым требованиям, что и имя элемента — оно должно начинаться с буквы и может содержать другие буквы, цифры и некоторые знаки препинания.
атрибута может быть одним из следующих:
□ CDATA
— символьные данные;
□ ID
— уникальный идентификатор;
□ IDREF
— ссылка на уникальный идентификатор;
□ IDREFS
— набор ссылок;
□ ENTITY
— сущность;
□ ENTITIES
— набор сущностей;
□ NMTOKEN
— именной токен;
□ NMTOKENS
— набор именных токенов;
□ NOTATION
— нотация;
□ перечисление возможных значений атрибута.
Следует поподробнее остановиться на типе ID
, поскольку атрибуты этого типа играют важную роль в повышении эффективности обработки XML-документов. Атрибуты типа ID
могут содержать значения, которые однозначным образом идентифицируют элемент в документе. То есть, если тип атрибута объявлен как ID
, его значение ID
-атрибутами индексы по значению атрибута, для более быстрого доступа. Например, в языке XPath, имеется функция id
, которая по данному строковому параметру возвращает множество, состоящее из элемента, ID
-атрибут которого совпадает с этим параметром. Естественно, тип ID
не гарантирует, что доступ к элементам в любом случае будет производиться быстрее — это зависит от реализации обрабатывающих программ. Однако большинство современных XML-процессоров при работе с ID
-атрибутами используют механизмы оптимизации.
Тип ID
может быть полезен и при создании кросс-ссылок между элементами в самих XML-документах, для описания информации, структура которой выходит за рамки обычных деревьев. Уникальные значения, заданные в атрибуте ID
могут использоваться в атрибутах типов IDREF
(ссылка на идентифицирующее значение) и IDREFS
(набор таких ссылок).
определяет, как и какие значения должны быть присвоены атрибуту.
может быть:
□ ключевое слово #REQUIRED
, которое показывает, что этот атрибут должен всегда присутствовать в элементе и иметь некоторое значение;
□ ключевое слово #IMPLIED
, которое показывает, что атрибут является необязательным и может отсутствовать в элементе;
□ ключевое слово #FIXED
, за которым следует значение, заключенное в кавычки — это задает атрибут, который всегда должен иметь одно и то же фиксированное значение;
□ значение, заключенное в кавычки, определяет значение атрибута по умолчанию.
Декларация
<!ATTLIST product
title CDATA #REQUIRED
id ID #IMPLIED
quantity CDATA '1'
value CDATA #FIXED 'дорого'
color (серый|белый) 'серый'>
определяет в элементе product
следующие атрибуты:
□ обязательный атрибут title
, содержащий символьные данные;
□ необязательный атрибут id
, который может содержать уникальный идентификатор элемента внутри документа;
□ атрибут quantity
, который может и не присутствовать в документе — в этом случае его значение будет равно 1
;
□ атрибут value
, который всегда должен иметь значение 'дорого'
;
□ атрибут color
, который может иметь одно из значений — 'серый'
или 'белый'
, по умолчанию 'серый'
.
Разберем синтаксис определения списка атрибутов более детально. Этому определению соответствует следующее правило:
[52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'
В этом правиле Name
задает имя элемента, a AttDef*
— набор определяемых атрибутов. Каждый атрибут задается правилом AttDef
:
[53] AttDef ::= S Name S AttType S DefaultDecl
Здесь Name
— имя, AttType
— тип, a DefaultDecl
— значение атрибута по умолчанию.
[54] AttType ::= StringType | TokenizedType | EnumeratedType
В соответствии со спецификацией, значения атрибутов бывают трех видов — строки (StringType
), токены (TokenizedType
) и тип перечисления (EnumeratedType
).