Нетерминалы 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 — разбираемые символьные данные).
Читать дальше