Содержание
Этот раздел посвящён SGML и его взаимосвязям с HTML. Полное обсуждение SGML находится в стандарте (см. [ISO8879]).
SGML - это система определения языков разметки.
Авторы
размечают
свои документы, вводя структурную,
представительную и семантическую
информацию параллельно с основным
содержимым.
HTML - это один из языков разметки.
Вот пример документа HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <HTML> <HEAD> <TITLE>My first HTML document</TITLE> </HEAD> <BODY> <P>Hello world! </BODY> </HTML>
Документ HTML состоит из раздела-шапки (здесь - между <HEAD> и </HEAD>) и тела (здесь - между <BODY> и </BODY>). Название документа содержится в шапке (наряду с другой информацией о документе), а содержимое документа находится в его теле/ body. Тело в этом примере состоит из одного параграфа, помеченного <P>.
Каждый язык разметки, определённый в SGML, называется SGML приложением. Приложение SGML обычно характеризуется:
Эта спецификация включает объявление SGML, три определения типа документов (см. раздел информация о версии HTML) список ссылок-мнемоник.
Следующие разделы посвящены конструкциям SGML, используемым в HTML.
В приложении описаны некоторые возможности SGML, которые не поддерживаются широко утилитами HTML и пользовательскими агентами (ПА), и использование которых должно быть исключено.
Определение типа документа в SGML определяет типы элементов, представляющих структуру или необходимое поведение. HTML содержит типы элементов, представляющих параграфы, гипертекстовые ссылки, списки, таблицы, изображения и т.д.
Каждое объявление типа элемента обычно описывает три части: начальный тег, содержимое и конечный тег.
Название элемента появляется в начальном теге (<название-элемента>) и в конечном теге (</название-элемента>); обратите внимание на слэш "/" перед названием элемента в конечном теге. Например, стартовый и конечный теги типа элемента UL обозначают границы списка:
<UL> <LI><P>...элемент списка 1... <LI><P>...элемент списка 2... </UL>
Некоторые элементы HTML допускают
отсутствие конечного тега (напр., типы
элементов P и LI).
Немногие элементы допускают также
отсутствие и
начальных тегов, например,
HEAD и
BODY. ОТД HTML указывает для
каждого типа элементов, требуются ли
начальный и конечный теги.
Некоторые типы элементов HTML не имеют содержимого. Например, обрыв строки BR не имеет содержимого, его единственная задача - обозначить конец строки текста. Такие пустые элементы никогда не имеют конечного тега. В определении типа документа и в тексте этой спецификации указывается, является ли элемент пустым (не имеет содержимого) или, если он может иметь содержимое, что может быть допустимым содержимым.
Названия элементов всегда нечувствительны к регистру
См. в стандарте SGML информацию о правилах использования элементов (напр., они должны быть правильно вложены, конечный тег закрывает, назад по направлению к соответствующему начальному тегу, все незакрытые начальные теги с отсутствующими конечными тегами (раздел 7.5.1) и т.д.).
Например, этот параграф:
<P>Это первый параграф.</P> ...элемент блок...
может быть переписан без конечного тега:
<P>Это первый параграф. ...элемент блок...
поскольку начальный тег <P> закрывается следующим после него блоком. То же самое, если параграф закрыт элементом блок:
<DIV> <P>Это параграф. </DIV>
конечный тег окружающего элемента блок (здесь - </DIV>) подразумевает конечный тег открытого начального тега <P>.
Элементы это не теги. Многие
полагают, что элементы - это и есть теги (напр.,
"тег P").
Помните, что элемент - это одно, а тег (начальный
или конечный) - это другое. К примеру,
элемент HEAD всегда представлен, даже если
оба тега HEAD, начальный и конечный,
отсутствуют в разметке.
Все типы элементов, объявленные в этой спецификации, перечислены в Индексе элементов.
Элементы могут иметь ассоциированные свойства, называемые атрибутами, которые могут иметь значения (по умолчанию или устанавливаемые автором или скриптом). Пары атрибут/значение появляются перед конечным символом ">" начального тега элемента. Любое количество (допустимое) пар значений атрибута, разделённых пробелами, может появляться в начальном теге элемента. Они могут появляться в любом порядке.
В этом примере атрибут id установлен для элемента H1:
<H1 id="section1"> Это идентифицируемый заголовок, благодаря атрибуту id </H1>
По умолчанию SGML требует, чтобы все значения атрибутов были ограничены с использованием двойных кавычек либо метки двойной кавычки (ASCII десятеричная 34) или метки одиночной кавычки (ASCII десятеричная 39). Знак одиночной кавычки может быть включена в значение атрибута, если это значение ограничено знаком двойной кавычки, и наоборот. Авторы могут также использовать цифровые ссылки-мнемоники для представления двойной (") и одинарной (') кавычек. Для двойных кавычек можно использовать также символьную ссылку-мнемонику ".
В некоторых случаях авторы могут
устанавливать значение атрибута без
использования кавычек. Значение атрибута
может содержать только (a-z и A-Z), цифры (0-9),
дефисы (ASCII десятеричная 45), точку (ASCII
десятеричная 46), символ подчёркивания (ASCII
десятеричная 95) и двоеточие (ASCII
десятеричная 58).
Мы рекомендуем использовать знак кавычек
даже тогда, когда можно обойтись без него..
Названия атрибутов всегда нечувствительны к регистру.
Значения атрибутов вообще нечувствительны к регистру В определении каждого атрибута в справочнике указано, является ли его значение нечувствительным к регистру.
Все атрибуты, определённые в этой спецификации, перечислены индексе атрибутов.
Ссылки-мнемоники это цифровые или символьные имена символов, которые могут быть включены в документ HTML. Они употребляются как ссылки на редко используемые или затруднительные для воспроизведения авторскими утилитами символы. Вы встретите такие ссылки-мнемоники в этом документе повсюду, они начинаются знаком "&" и заканчиваются точкой с запятой (;). Вот некоторые распространённые сочетания:
Мы детально обсуждаем ссылки-мнемоники HTML позже в разделе набор символов документа HTML. В этой спецификации есть также список символьных ссылок, которые могут употребляться в документах HTML 4.
Комментарии HTML имеют следующий синтаксис:
<!-- это комментарий --> <!-- и это тоже комментарий, занимающий более одной строки -->
Не допускаются пробелы между открывающим ограничителем объявления разметки ("<!") и открывающим ограничителем комментария ("--"), но разрешаются между закрывающим ограничителем комментария ("--") и закрывающим ограничителем объявления разметки (">"). Обычная ошибка - включение внутрь комментария строки ("---"). Авторы должны исключить использование внутри комментариев двух или более смежных дефисов.
Информация комментариев не имеет специального значения (напр., ссылки-мнемоники не интерпретируются как таковые).
Обратите внимание, что комментарии это разметка.
Каждое объявление элемента или атрибута в
этой спецификации сопровождается
соответствующим фрагментом определения
типа документа. Мы решили включать
фрагменты ОТД в спецификацию вместо того,
чтобы использовать более подходящие, но и
более длинные и менее точные способы
описания свойств элемента.
Этот учебник должен помочь читателям, не
знакомым с SGML, разобраться в ОТД и понять
технические детали этой спецификации HTML.
Комментарии в ОТД могут быть одно- или многострочными. Комментарии в ОТД это текст, ограниченный парами знаков "--", например:
<!ELEMENT PARAM - O EMPTY -- именованное значение свойства -->
ОТД HTML начинается серией определений объектов-параметров. Определение объекта-параметра определяет макрос особого типа, на который можно ссылаться и который может быть развёрнут где-либо в ОТД. Эти макросы могут не появляться в самом документе HTML, а только в ОТД. Макросы других типов, называемые ссылки-мнемоники, могут быть использованы в тексте документа HTML или внутри значений атрибутов.
Если на объект-параметр ссылаются по имени из ОТД, он разворачивается в строку.
Определение объекта-параметра начинается ключевым словом <!ENTITY % с последующим именем объекта-параметра, строки в кавычках, в которую объект-параметр разворачивается, и конечного закрывающего >. Появления объектов-параметров в ОТД начинаются со знака "%", затем имени объекта-параметра и необязательного заключительного знака ";".
Вот определение строки, в которую разворачивается объект-параметр "%fontstyle;".
<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">
Строка, в которую разворачивается объект-параметр, может содержать имена других объектов-параметров. Эти имена разворачиваются рекурсивно. В следующем примере, объект-параметр "%inline;" определён с включением объектов-параметров "%fontstyle;", "%phrase;", "%special;" и "%formctrl;".
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
Вы можете заметить далее, что два объекта-параметра ОТД часто появляются в ОТД HTML: "%block;" и "%inline;". Они используются, если модель содержимого включает соответственно элементы уровня блока/block-level и инлайн/ inline (определены в разделе глобальная структура документа HTML).
Как правило, ОТД HTML состоит из объявления типа элемента и его атрибута. Ключевое слово<!ELEMENT открывает объявление, а символ > закрывает. Между ними определяются:
В этом примере:
<!ELEMENT UL - - (LI)+>
В этом примере иллюстрируется объявление пустого типа элемента:
<!ELEMENT IMG - O EMPTY>
Модель содержимого указывает, что может содержать в себе объект данного типа элементов. Определение модели содержимого может включать:
Синтаксис спецификации модели содержимого элемента следующий. Обратите внимание, что данный список является упрощённым по сравнению с полным синтаксисом SGML и не адресует, напр., старшинство.
Вот некоторые примеры ОТД HTML:
<!ELEMENT UL - - (LI)+>
Элемент UL должен содержать один или более элементов LI.
<!ELEMENT DL - - (DT|DD)+>
Элемент DL должен содержать один или более элементов DT или DD в любом порядке.
<!ELEMENT OPTION - O (#PCDATA)>
Элемент OPTION может содержать только текст и мнемоники, такие как & - это указано SGML типом данных #PCDATA.
Некоторые типы элементов HTML используют дополнительные возможности SGML для того, чтобы исключить элементы из их модели содержимого. Исключаемым элементам предшествует дефис. Явные исключения переопределяют допустимые элементы.
В этом примере -(A) означает, что элемент A не может появляться в другом элементе A (т.е. якоря не могут быть вложенными).
<!ELEMENT A - - (%inline;)* -(A)>
Заметьте, что тип элемента A является частью ОТД объекта-параметра "%inline;", но явно исключён, поскольку указано -(A).
Таким же образом, следующее объявление типа элемента FORM запрещает вложение форм:
<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>
Ключевое слово <!ATTLIST открывает объявление
атрибутов, которые могут быть приняты
элементом. Следом идёт имя элемента, список
определений атрибутов и закрывающий >.
Каждое определение атрибута состоит из
трёх частей:
В этом примере атрибут name определён для элемента MAP. Атрибут для этого элемента не обязателен.
<!ATTLIST MAP name CDATA #ПРЕДПОЛАГАЕТСЯ >
Тип допустимых значений атрибута даётся как CDATA типа данных SGML. CDATA это текст, который может содержать символьные ссылки-мнемоники.
Дополнительную информацию о "CDATA", "NAME", "ID" и других типах данных см. в разделе типы данных HTML.
Следующие примеры иллюстрируют различные определения атрибутов:
rowspan NUMBER 1 -- количество рядов таблицы, занимаемых ячейкой -- http-equiv NAME #ПРЕДПОЛАГАЕТСЯ -- имя "шапки" ответа HTTP -- id ID #ПРЕДПОЛАГАЕТСЯ -- уникальный идентификатор документа id -- valign (top|middle|bottom|baseline) #IMPLIED
Атрибут rowspan требует значение типа NUMBER. Значение по умолчанию даётся явно как "1". Предполагаемый атрибут http-equiv требует значений типа NAME. Предполагаемый атрибут id требует значений типа ID. Предполагаемый атрибут valign сконструирован так, чтобы принимать значения из списка {top, middle, bottom, baseline}.
Определения атрибутов могут также содержать ссылки на объекты-параметры.
В этом примере мы видим, что список определения атрибута элемента LINK начинается объектом-параметром "%attrs;":
<!ELEMENT LINK - O EMPTY -- независимая от типа носителя ссылка --> <!ATTLIST LINK %attrs; -- %coreattrs, %i18n, %events -- charset %Charset; #ПРЕДПОЛАГАЕТСЯ -- набор символов связанного ресурса -- href %URI; #ПРЕДПОЛАГАЕТСЯ -- URI связанного ресурса -- hreflang %LanguageCode; #ПРЕДПОЛАГАЕТСЯ -- код языка -- type %ContentType; #ПРЕДПОЛАГАЕТСЯ -- информативный тип содержимого -- rel %LinkTypes; #ПРЕДПОЛАГАЕТСЯ -- типы ссылки вперёд -- rev %LinkTypes; #ПРЕДПОЛАГАЕТСЯ -- типы ссылки назад -- media %MediaDesc; #ПРЕДПОЛАГАЕТСЯ -- для представления данным носителем -- >
Начальный тег: необходим, Конечный тег: запрещён
Объект-параметр "%attrs;" определён так:
<!ENTITY % attrs "%coreattrs; %i18n; %events;">
Объект-параметр "%coreattrs;" в определении "%attrs;" расширяется так:
Объект-параметр "%attrs;" определён по соглашению, поскольку эти атрибуты определены для большинства типов элементов HTML.
Таким же образом ОТД определяет объект-параметр "%URI;" и расширяет его в строку "CDATA".
Как показано в этом примере, объект-параметр "%URI;" даёт читателю больше информации как об ОТД, так и о типе данных, ожидаемых для данного атрибута. Так же определяются объекты-параметры "%Color;", "%Charset;", "%Length;", "%Pixels;" и т.д.
Некоторые атрибуты играют роль булевых переменных (напр., атрибут selected элемента OPTION). Их появление в начальном теге элемента подразумевает, что значение атрибута - "true". Их отсутствие подразумевает, что значение - "false".
Булевы атрибуты могут принимать единственное значение: само имя атрибута (напр., selected="selected").
В этом примере атрибут selected является булевым атрибутом.
selected (selected) #IMPLIED -- опция предустановлена --
Этот атрибут установлен "true" в начальном теге элемента:
<OPTION selected="selected"> ...содержимое... </OPTION>
В HTML булевы атрибуты могут появляться в минимизированной форме - значение атрибута value появляется без дополнения в начальном теге элемента. Таким образом, selected можно установить:
<OPTION selected>
вместо:
<OPTION selected="selected">
Авторы должны учитывать, что многие ПА могут распознавать только минимизированные формы булевых атрибутов, но не полные.