Технология XSLT - страница 16

стр.

, сообщающий дополнительную информацию о ресурсе. Обрабатывающее программное обеспечение может включать в себя DTD для заданного публичного идентификатора. Например, документы, написанные на языке XHTML, должны начинаться следующим объявлением:

>

> "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">

Программа, обрабатывающая документ с таким заголовком, сможет по публичному идентификатору понять, что документ создан на языке XHTML, а значит, обрабатывать его нужно в соответствии со стандартом этого языка. Если же обрабатывающая программа не в курсе определений XHTML, она сможет загрузить декларацию типа по адресу http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd. Публичные идентификаторы, как правило, используются в языках, получающих широкое распространение, поскольку в этом случае формат логической структуры будет известен и без загрузки DTD.

Выражение >('[' (markupdecl | DeclSep) * ']' S?) ? в продукции >doctypedecl означает, что в декларации типа документа в квадратных скобках может содержаться последовательность нетерминалов >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.

Определение элемента

Определение элемента задает имя и тип содержимого элемента в следующем виде:

>

Имя элемента должно начинаться с буквы, подчеркивания (">_") или двоеточия (">:") и содержать буквы, цифры, некоторые знаки пунктуации (такие, как ">_" — подчеркивание, ">:" — двоеточие, ">." — точка, ">-" — тире или знак минуса) и модифицирующие символы (см. разд. "Базовые продукции ХМL" данной главы).

Примером имени элемента может быть ">A", ">B:12", ">MyEasyName", ">doc.xml".

В качестве содержимого элемента может быть указано:

□ >EMPTY, в случае, когда элемент обязан быть пустым;

□ >ANY, в случае, когда элемент может содержать что угодно;

□ формальное правило, определяющее элементы, и данные, которые может содержать элемент, а также порядок их следования.

Первые два случая определения элемента довольно просты. Их использование может быть продемонстрировано на следующем примере:

>Декларация

>

>

>

>

>]>

определяет документ с корневым элементом >advert, в котором могут встречаться также элементы >product и >classified, причем элементы >advert и >product могут содержать любые данные и любые из объявленных элементов, а элемент >classified всегда должен быть пустым.

Приведем пример документа, построенного в соответствии с этой декларацией.

Листинг 1.3. Документ с декларацией типа

>

>

>

>

>

>]>

>

>  Покупайте наших слонов!

>

В третьем случае содержимое элемента определяется при помощи формальных правил, которые очень похожи на те, которые используются в расширенных формах Бэкуса-Наура. Подобно тому, как в EBNF формальные правила используются для того, чтобы стандартизировать последовательность символов, составляющую конструкции некоторого языка, в определениях элементов они используются для описания содержимого элемента — последовательности из символьных данных и дочерних элементов.