&#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-языка вдруг произойдет смена регистра имен элементов xy и 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 имя SYSTEM 'системный ид- р'>

<!NOTATION имя PUBLIC 'публичный ид-р' 'системный ид-р'>

<!NOTATION имя PUBLIC 'публичный ид- р'>

Если информация о вспомогательном приложении несущественна, можно воспользоваться определением следующего вида:

<!NOTATION имя SYSTEM ''>

Существует два основных способа применения нотаций. Первый — объявление неразбираемых сущностей и использование их имен в атрибутах типа ENTITY или ENTITIES, второй — указание имени нотации в атрибуте типа NOTATION для того, чтобы задать формат данных, который содержит данный элемент.

Первый способ можно продемонстрировать простым документом, который задает меню (листинг 1.5).

Листинг 1.5. Использование неразбираемых сущностей в атрибутах элементов

<!DOCTYPE menu [

Вы читаете Технология XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату