</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).
