<product>
Покупайте наших слонов!
</product>
<classified/>
</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 элемент
атрибут1 тип1 значение1
атрибут2 тип2 значение2
и т. д...>
В этом определении элемент
задает имя элемента, для которого определяется данный список атрибутов, атрибут
— имя атрибута, тип
— тип атрибута и значение
— значение атрибута.
Имя
атрибута отвечает в 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
).
[55] StringType ::= 'CDATA'
[56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY'
| 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS'
Тип перечисления (EnumeratedType
) может задаваться нотациями (NotationType
) и собственно перечислениями (Enumeration
):
[57] EnumeratedType ::= NotationType | Enumeration
[58] NotationType ::= 'NOTATION' S
'(' S? Name (S? '|' S? Name)* S? ')'
Перечисление — это один или несколько именных токенов, которые разделены пробелами и знаками "|
". Перечисление задает несколько возможных вариантов значения атрибута, например (серый | белый)
.
[59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')'
Значение атрибута описывается продукцией DefaultDecl
следующим образом: