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