означает, что в декларации типа документа в квадратных скобках может содержаться последовательность нетерминалов
markupdecl
и
DeclSep
.
Первый из этих нетерминалов,
markupdecl
, показывает, определения какого вида содержатся в DTD:
[29] markupdecl ::= elementdecl
| AttlistDecl
| EntityDecl
| NotationDecl
| PI
| Comment
С
правилами
PI
и
Comment
мы уже знакомы — в данной продукции они показывают, что в DTD также можно использовать инструкции по обработке и комментарии.
Нетерминалы
elementdecl
,
AttlistDecl
,
EntityDecl
и
NotationDecl
соответствуют определениям элемента, списка атрибутов, сущности и нотации. Они будут подробно разобраны в следующих четырех разделах.
Нетерминал
DeclSep
соответствует разделителю объявлений, которые перечисляются в DTD. Этот разделитель может быть либо пробельным пространством, либо параметризованной сущностью:
[28а] DeclSep ::= PEReference | S
В случае, если определения в DTD разделяются сущностью-параметром, ее содержимое интерпретируется как обычные определения вида
markupdecl
.
Определение элемента
Определение элемента задает имя и тип содержимого элемента в следующем виде:
<!ELEMENT имя содержимое>
Имя элемента должно начинаться с буквы, подчеркивания ("
_
") или двоеточия ("
:
") и содержать буквы, цифры, некоторые знаки пунктуации (такие, как "
_
" — подчеркивание, "
:
" — двоеточие, "
.
" — точка, "
–
" — тире или знак минуса) и модифицирующие символы (см. разд. "Базовые продукции ХМL" данной главы).
Примером имени элемента может быть "
A
", "
B:12
", "
MyEasyName
", "
doc.xml
".
В качестве содержимого элемента может быть указано:
□
EMPTY
, в случае, когда элемент обязан быть пустым;
□
ANY
, в случае, когда элемент может содержать что угодно;
□ формальное правило, определяющее элементы, и данные, которые может содержать элемент, а также порядок их следования.
Первые два случая определения элемента довольно просты. Их использование может быть продемонстрировано на следующем примере:
Декларация
<!DOCTYPE advert [
<!ELEMENT advert ANY>
<!ELEMENT product ANY>
<!ELEMENT classified EMPTY>
]>
определяет
документ с корневым элементом
advert
, в котором могут встречаться также элементы
product
и
classified
, причем элементы
advert
и
product
могут содержать любые данные и любые из объявленных элементов, а элемент
classified
всегда должен быть пустым.
Приведем пример документа, построенного в соответствии с этой декларацией.
Листинг 1.3. Документ с декларацией типа
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE advert [
<!ELEMENT advert ANY>
<!ELEMENT product ANY>
<!ELEMENT classified EMPTY>
]>
<advert>
<product>
Покупайте наших слонов!
</product>
<classified/>
</advert>
В третьем случае содержимое элемента определяется при помощи формальных правил, которые очень похожи на те, которые используются в расширенных формах Бэкуса-Наура. Подобно тому, как в EBNF формальные правила используются для того, чтобы стандартизировать последовательность символов, составляющую конструкции некоторого языка, в определениях элементов они используются для описания содержимого элемента — последовательности из символьных данных и дочерних элементов.
Количество, с которым элемент может появляться в этой последовательности, формально записывается с использованием символов-модификаторов "
*
", "
?
", "
+
", которые имеют следующие значения:
□
а?
— означает, что элемент
а
может быть пропущен в последовательности;
□
а
— означает, что элемент
а
должен присутствовать в последовательности на этом месте ровно один раз;
□
а*
— задает последовательность из нуля или более элементов
а
;
□
a+
— задает последовательность из одного или более элементов
а
.
Кроме того, содержимое может моделироваться как перечисление и выбор элементов.
Элементы перечисляются через запятую в круглых скобках, например
(a, b, c)
— это последовательность, состоящая из элементов
a
,
b
,
c
. Такая запись означает, что первым должен идти элемент