Сущности являются механизмом для назначения имен частям содержимого. Когда анализатор SGML обрабатывает ваш документ, все сущности, которые он найдет, заменяются на их содержимое.
Это хороший способ иметь повторно используемые легко заменяемые куски содержимого в вашем документе SGML. Также это является единственным способом включить один размеченный файл в другой средствами SGML.
Имеется два типа сущностей, которые могут быть использованы в двух различных ситуациях; сущности общего вида и параметризированые сущности.
Вы не можете использовать сущности общего вида в содержимом SGML (если только вы не определили их в нем). Они могут использоваться только в вашем документе. Сравните это с параметризированными сущностями.
Каждая сущность общего вида имеет имя. Когда вы хотите сослаться на такую сущность (и таким образом включить некоторый текст, который она представляет, в ваш документ), вы пишете &имя-сущности;. К примеру, положим, что у вас есть сущность под названием current.version, которая расширяется в номер текущей версии вашего продукта. Вы можете написать;
<para>Текущей версией нашего продукта является ¤t.version;.</para>
Когда меняется номер версии, вы можете просто изменить определение значения сущности общего вида и повторно обработать ваш документ.
Вы можете также использовать сущности общего вида для ввода символов, которые вы не можете включить в документ SGML никаким другим способом. Например, символы < и & не могут появиться в документе SGML в явном виде. Когда анализатор SGML видит символ <, он полагает, что это начало метки (начальной или конечной), а когда обнаруживает символ &, то полагает, что последующий текст будет являться именем сущности.
К счастью, вы можете использовать две сущности общего вида < и &, когда хотите включить в текст один из этих символов
Сущность общего назначения может быть определена только в содержимом SGML. Как правило, это делается сразу же после декларации DOCTYPE.
Пример 3-10. Задание сущностей общего назначения
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [ <!ENTITY current.version "3.0-RELEASE"> <!ENTITY last.version "2.2.7-RELEASE"> ]>
Заметьте, как была расширена декларация DOCTYPE путем добавления квадратных скобок в конце первой строки. Затем в последующих двух строках до закрывающих квадратных скобок, были заданы две сущности, а затем закрыта декларация DOCTYPE.
Квадратные скобки необходимы для указания того, что мы расширяем DTD, на которое ссылается декларация DOCTYPE.
Как и сущности общего назначения, параметризированные сущности могут использоваться только в контексте SGML.
Параметризированные сущности определяются способом, похожим на определение сущностей общего назначения. Однако вместо использования &имени-сущности; для ссылки на нее, используется %имя-сущности; [1]. Определение также включает % между ключевым словом ENTITY и именем сущности.
Пример 3-11. Задание параметризированных сущностей
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [ <!ENTITY % param.some "some"> <!ENTITY % param.text "text"> <!ENTITY % param.new "%param.some more %param.text"> <!-- %param.new теперь содержит "some more text" --> ]>
Это может выглядеть не часто полезным. Но это так.
Добавьте сущность общего назначения в example.sgml.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" [ <!ENTITY version "1.1"> ]> <html> <head> <title>Пример файла HTML</title> </head> <!-- Вы можете также поместить здесь комментарии --> <body> <p>Этот параграф содержит некоторый текст.</p> <p>Этот параграф содержит некоторый дополнительный текст.</p> <p align="right">Этот параграф может быть выравнен по правому краю.</p> <p>Текущая версия этого документа: &version;</p> </body> </html>
Проверьте документ посредством nsgmls
Загрузите example.sgml в ваш веб-браузер (вам может потребоваться скопировать его в example.html перед тем, как вам браузер распознает его в качестве документа HTML).
Если только ваш браузер не сложен, вы не увидите ссылку на сущность &version;, замененную на номер версии. Большинство веб-браузеров имеют весьма упрощенные анализаторы, которые не в полной мере обрабатывают SGML [2].
Решение заключается в нормализации вашего документа при помощи нормализатора SGML. Нормализатор читает правильный SGML и выводит соответствующий правильный SGML, который был некоторым образом преобразован. Одним из способов преобразования SGML нормализатором заключается в расширении всех ссылок на сущности в документе заменой их на соответствующий текст.
Для этого вы можете использовать sgmlnorm.
% sgmlnorm example.sgml > example.html
Вы должны найти нормализованную (то есть с расширенными ссылками на сущности) копию вашего документа в example.html, готовую для загрузки в ваш веб-браузер.
Если вы посмотрите на вывод команды sgmlnorm, то увидите, что
в его начале не включена декларация DOCTYPE. Для ее включения вам нужно использовать
опцию -d
;
% sgmlnorm -d example.sgml > example.html
[1] |
P - Параметризированные сущности используют символ P - процента. |
[2] |
Это позор. Представьте все проблемы и хэки (такие, как Server Side Includes), которых можно было бы избежать, если бы это было сделано. |
Пред. | Начало | След. |
Комментарии | Уровень выше | Использование сущностей для включения файлов |
Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.