A Gentle Introduction to SGML


Содержание

Введение в SGML
Особенности SGML
   Описательная разметка
   Типы документов
   Независимость данных
Структура текста
SGML структуры
   Элементы
   Модели содержимого элемента: пример
Определение структуры документов SGML: DTD
   Пример DTD
   Правила минимизации
   Модель содержимого
   Обозначения включения
   Связки
   Группы модели
Усложнение: еще об описаниях элементов
   Исключения в модели содержимого
   Альтернативные структуры
Атрибуты
Объекты SGML
Отмеченные секции
Картина в целом
   Объявление SGML
   DTD
   Тело документа
Использование SGML

Введение в SGML

      Схема кодирования, определяемая этим Руководством, является приложением системы, известной как стандартный язык обобщенной разметки (Standard Generalized Markup Language, SGML). (International Organization for Standardization,ISO 8879: Information processing -- Text and office systems -- Standard Generalized Markup Language (SGML),([Geneva]: ISO, 1986).) SGML -- международный стандарт на определение не зависящих от платформы и системы методов представления текстов в электронной форме. Эта глава представляет из себя краткое введение в основы SGML для тех читателей, кто не встречались с ним ранее. ...

      SGML является международным стандартом на описание размеченного электронного текста. Точнее, SGML -- это метаязык (metalanguage), то есть, средство формального описания языка, в данном случае, языка разметки (markup language). Прежде, чем продолжать, определим эти термины.

      Исторически слово разметка (markup) использовалось для описания аннотаций или других отметок в тексте, предназначенных для указания машинистке или наборщику, как именно должна быть напечатана или набрана определенная фраза. Примеры включают волнистое подчеркивание для обозначения жирного шрифта, специальные символы для обозначения пропуска отдельных предложений или их печати определенным шрифтом, и т.п. С автоматизацией форматирования и печати текстов термин был расширен, охватывая сейчас всяческие коды разметки (markup codes), вставляемые в электронные тексты для управления форматированием, печатью или иной обработкой.

      Обобщая, мы определяем разметку или кодирование (encoding), как любой метод выявления интерпретации текста. На примитивном уровне все печатные тексты кодированы в этом смысле: знаки пунктуации, использование заглавных букв, размещение букв на странице, даже пробелы между словами можно считать своеобразной разметкой, функция которой -- помочь читателю определить, где заканчивается одно слово и начинается другое, или как отделить структурные элементы, например, заголовки, или элементы локальной структуры, например, подчиненные предложения. Кодирование текста для компьютерной обработки в принципе, так же, как и транскрипция рукописи из scriptio continua, -- процесс выявления того, что неявно или предположительно, процесс указания пользователю, как интерпретировать содержимое текста.

      Под языком разметки мы понимаем набор соглашений о разметке, используемых в комплексе для кодирования текстов. Язык разметки должен специфицировать, какая разметка является допустимой, какая -- необходимой, как различаются разметка и текст, и что разметка означает. SGML предоставляет средства решения первых трех задач; последняя требует документов, подобных настоящему Руководству.

      Настоящая глава пытается дать неформальное введение -- гораздо менее формальное, чем сам стандарт -- в те составляющие SGML, понимание которых необходимо для наилучшего понимания этого Руководства.


Особенности SGML

      Существуют три характеристики SGML, отличающие его от других языков разметки: его упор на описательную, а не на процедурную разметку; его концепция типа документа (document type); его независимость от конкретной системы в представлении текста. Эти три аспекта кратко обсуждаются ниже, и, более подробно, в разделах SGML структуры и Объекты SGML.

Описательная разметка

      Система описательной разметки использует коды разметки, просто предоставляющие названия для классификации частей документа. Коды, такие, как <para> или \end{list} просто идентифицируют часть документа и утверждают про нее: "следующий элемент -- параграф" или "это -- конец начатого последним списка" и т.д. Напротив, система процедурной разметки определяет, какая обработка должна производиться в конкретной точке документа: "здесь вызвать процедуру PARA с параметрами 1, b и x", или "сдвинуть левую границу на 2см влево, правую -- на 2см вправо, пропустить строку и встать на новую левую границу", и т.д. В SGML инструкции, необходимые для обработки документа с определенными целями (например, для его форматирования) четко отделяются от описательной разметки, встречающейся внутри документа. Обычно они собираются вне документа в отдельных процедурах или программах.

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

Типы документов

      SGML вводит понятие типа документа и, как следствие, определения типа документа (document type definition, DTD). Тип документа формально определяется его составными частями и их структурой. Например, определение отчета может констатировать, что он состоит из заголовка, возможно, автора, за которым следуют аннотация и один или несколько абзацев. Все, что не имеет заголовка, в соответствии с этим формальным определением, отчетом не является, так же, как не является им последовательность абзацев, за которой следует аннотация, вне зависимости от того, насколько такие документы похожи на отчет для читателя-человека.

      Раз документы имеют известные типы, можно использовать специальную программу, называющуюся анализатором (parser), для проверки документа, утверждающего свою принадлежность определенному типу. Анализатор проверяет, что все элементы, требуемые типом документа, на самом деле присутствуют и расположены в правильном порядке. Что более важно, разные документы одного и того же типа могут обрабатываться одинаковым образом. Можно конструировать программы, использующие знание структуры документа, которые, таким образом, могут действовать в более осмысленной манере.

Независимость данных

      Основная цель создания SGML заключалась в том, чтобы обеспечить транспортабельность закодированных документов из одной аппаратной и программной среды в другую без потери информации. Два описанных выше свойства решают эту задачу на абстрактном уровне; третье свойство -- на уровне строк байтов (символов), из которых составляется документ. SGML предоставляет универсальный механизм строковой подстановки (string substitution), то есть, простой машинно-независимый способ обозначить, что некоторая последовательность символов в документе должна заменяться при его обработке некоторой другой последовательностью. Одно очевидное применение этого механизма -- обеспечение согласованности номенклатуры; другое, и более важное, -- противодействие печально известной неспособности различных компьютерных систем понимать наборы символов друг друга, или способ в любой системе предоставить все графические символы, необходимые для конкретного приложения, путем использования описательных обозначений непереносимых символов. Строки, определенные этим механизмом подстановки, называются объектами (entities) и обсуждаются ниже в разделе Объекты SGML.


Структура текста

      Текст не является просто однородной последовательностью слов, или, тем более, байтов. Для различных целей он может быть разделен на множество разных единиц разных типов или размеров. Текст в прозе, такой, как этот, можно разделить на разделы, главы, абзацы и предложения. Стихотворный текст можно делить на песни, строфы и строки. Будучи напечатанным, и проза и поэзия может делиться на тома, сборники, страницы.

      Такого рода структурные единицы чаще всего используют для идентификации конкретной позиции или ссылки внутри текста ("третье предложение второго абзаца десятой главы"; "песнь 10, строка 1234"; "страница 412" и т.п.), но они могут также применяться для деления текста на осмысленные сегменты для аналитических целей ("отличаются ли средние длины предложений раздела 2 и раздела 5?"; "сколько абзацев разделяют появления слова природа?"; "сколько страниц?"). Иные структурные единицы имеют явно аналитический характер, характеризуя часть текста. Драматический текст может считать каждую реплику разных действующих лиц единицей одного сорта, а ремарки или описания перемещений -- единицами другого сорта. Такой анализ менее полезен для нахождения частей текста ("93я реплика Горацио во втором акте"), чем для сравнения слов, использованных разными действующими лицами, или одним и тем же лицом в разных местах спектакля.

      В прозаическом тексте также можно выделять в качестве единиц разнообразные предложения прямой или непрямой речи, фразы, использующие разную стилистику (описание, спор, комментарий и т.п.), фразы разных людей и так далее. А для некоторых типов анализа (например, критики) может оказаться важным физическое представление конкретного печатного или рукописного источника: парадоксально, что описательная разметка может использоваться для описания свойств представления, таких, как шрифт, разбиение на строки, использование пробелов и тому подобных.

      Эти структуры тестов пересекаются друг с другом сложным и непредсказуемым образом. В частности, при работе с текстами, существующими в бумажном виде, читатель должен понимать и физическую организацию книги, и логическую структуру работы, в ней содержащейся. Многие вещи (например, Tristram Shandy Sterne) нельзя полностью оценить, не зная игры между повествовательными единицами (такими, как главы и абзацы) и границами страниц. Для мно