&#x
— это ссылка на символьную, а &
— на обычную сущность. Сама сущность — это именованный объект, к которому обрабатывающая программа должна обращаться при обработке ссылки с соответствующим именем. Однако, поскольку связь между сущностью и ссылкой на нее однозначна (одно не существует без другого), сами ссылки очень часто называют сущностями. Название продукции Reference
переводится с английского как 'ссылка', но пониматься в данном контексте может, в том числе, и как сущность.
Определение обычной сущности соответствует следующей продукции:
[71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'
Name
, как обычно, определяет имя, a EntityDef
, соответственно, значение сущности. Это значение может быть задано как внутри документа (первый вариант выбора, EntityValue
), так и вне его (второй вариант, ExternalID NDataDecl?
).
[73] EntityDef ::= EntityValue | (ExternalID NDataDecl?)
EntityValue
— это всего лишь символьное значение, взятое в кавычки.
Второй вариант синтаксиса EntityDef
соответствует определению внешней сущности, то есть сущности, определение которой не содержится в самом документе.
Внешние сущности могут быть двух типов:
□ разбираемые внешние сущности (англ. parsed entity) — данные, которые воспринимаются и обрабатываются как XML;
□ неразбираемые внешние сущности (англ. unparsed entity) — данные не-XML типа (например, изображения или бинарные файлы, которые необходимо использовать в данном документе).
Неразбираемые сущности определяются наличием нетерминала NDataDecl
в определении.
[76] NdataDecl ::= S 'NDATA' S Name
Мы до сих пор не упомянули еще один важный случай сущности — параметризованные сущности или сущности-параметры. Сущности этого типа используются в DTD для более гибкого описания логической структуры документа.
Синтаксически сущности-параметры очень похожи на обычные сущности. При объявлении и использовании сущности-параметра ее имени должен предшествовать символ '%
'. Отличием сущностей-параметров является то, что они определяются и используются только внутри DTD.
В качестве примера объявим параметризованную сущность coords
, которую впоследствии будем использовать в определениях элементов:
<!ENTITY % coords 'x, y, z'>
Используя объявленную сущность-параметр, элемент sphere
, состоящий из элементов x
, y
, z
(координаты сферы) и R
(радиус), можно определить следующим образом:
<!ELEMENT sphere (%coords;, R)>
Такое определение равносильно определению <!ELEMENT sphere (x, y, z, r) >
, но при этом оно является гораздо более гибким — если в новой версии создаваемого XML-языка вдруг произойдет смена регистра имен элементов x
, y
и z
на X
, Y
и Z
, декларацию типа документа изменять не придется.
Сущности-параметры широко используются в спецификациях Консорциума W3. Язык XSLT тоже имеет свою декларацию типа документа, но ее невозможно будет понять, не понимая механизма сущностей-параметров.
Синтаксис использования сущности-параметра (вернее, ссылки на нее) соответствует продукции PEReference
, которая практически совпадает с продукцией EntityRef
:
[69] PEReference ::= '%' Name ';'
Определение сущности-параметра также очень схоже с определением обычной сущности:
[72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
[74] PEDef ::= EntityValue | ExternalID
Продукция EntityDecl
, соответствующая определению сущности, как обычной, так и сущности-параметра, имеет следующий вид:
[70] EntityDecl ::= GEDecl | PEDecl
Напомним, что GEDecl
соответствует объявлению обычной, a PEDecl
— параметризованной сущности.
Определение нотации
С точки зрения физической модели, XML-документы являются не более чем текстом. Содержимое документов и их разметка имеет исключительно текстовый вид. Вместе с тем, во многих случаях документы должны включать данные других форматов, например, графические изображения или двоичные файлы. Несовместимость физической реализации XML и внешних данных такого типа не позволяет включать их в документ посредством обычных сущностей — для этих целей используются неразбираемые сущности и нотации.
Предположим, что мы используем графические изображения в формате GIF
, для просмотра которых используется приложение gif-viewer.exe
. Определение нотации будет иметь следующий вид:
<!NOTATION GIF SYSTEM 'gif-viewer.ехе'>
Эта запись определяет нотацию с именем GIF
и указывает имя приложения, которое может быть использовано для обработки внешних сущностей этого формата.
Информация о вспомогательном приложении-обработчике (англ. helper application) указывается при определении нотации системным или публичным идентификатором. В отличие от определения внешней сущности, публичный идентификатор в нотации может указываться без системного идентификатора. Фактически, нотация имеет три варианта определения:
<!NOTATION
<!NOTATION
<!NOTATION
Если информация о вспомогательном приложении несущественна, можно воспользоваться определением следующего вида:
<!NOTATION
Существует два основных способа применения нотаций. Первый — объявление неразбираемых сущностей и использование их имен в атрибутах типа ENTITY
или ENTITIES
, второй — указание имени нотации в атрибуте типа NOTATION
для того, чтобы задать формат данных, который содержит данный элемент.
Первый способ можно продемонстрировать простым документом, который задает меню (листинг 1.5).
<!DOCTYPE menu [