3   О  SGML и HTML

Содержание

  1. Введение в SGML
  2. Конструкции SGML, используемые в HTML
  3. Как читать Определение Типа Данных (ОТД) HTML

Этот раздел посвящён SGML и его взаимосвязям с HTML. Полное обсуждение SGML находится в стандарте (см. [ISO8879]).


3.1
Введение в SGML

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 обычно характеризуется:

  1. Объявлением SGML. Объявление SGML определяет, какие символы и ограничители могут появляться в приложении.
  2. Определением типа документов (ОТД)ОТД определяет синтаксис конструкций разметки. ОТД может включать дополнительные определения, такие как символьные ссылки-мнемоники.
  3. Спецификация, описывающая семантику, относится к разметке. Эта спецификация также даёт ограничения синтаксиса, которые не могут быть выражены внутри ОТД.
  4. Объектами документа, содержащими данные (содержимое) и разметку. Каждый объект содержит ссылку на ОТД, чтобы иметь возможность быть интерпретированным.

Эта спецификация включает  объявление SGML, три определения типа документов (см. раздел информация о версии HTML) список ссылок-мнемоник.


3.2
Конструкции SGML, используемые в HTML

Следующие разделы посвящены конструкциям SGML, используемым в HTML.

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

3.2.1 Элементы

Определение типа документа в 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, начальный и конечный, отсутствуют в разметке.

Все типы элементов, объявленные в этой спецификации, перечислены в Индексе элементов.

3.2.2 Атрибуты

Элементы могут иметь ассоциированные свойства, называемые атрибутами, которые могут иметь значения (по умолчанию или устанавливаемые автором или скриптом). Пары атрибут/значение появляются перед конечным символом ">" начального тега элемента. Любое количество (допустимое) пар значений атрибута, разделённых пробелами, может появляться в начальном теге элемента. Они могут появляться в любом порядке.

В этом примере атрибут id установлен для элемента H1:

<H1 id="section1">
Это идентифицируемый заголовок, благодаря атрибуту id
</H1> 

По умолчанию SGML требует, чтобы все значения атрибутов были ограничены с использованием двойных кавычек либо метки двойной кавычки (ASCII десятеричная 34) или метки одиночной кавычки (ASCII десятеричная 39). Знак одиночной кавычки может быть включена в значение атрибута, если это значение ограничено знаком двойной кавычки, и наоборот. Авторы могут также использовать цифровые ссылки-мнемоники для представления двойной (&#34;) и одинарной (&#39;) кавычек. Для двойных кавычек можно использовать также символьную ссылку-мнемонику &quot;.

В некоторых случаях авторы могут устанавливать значение атрибута без использования кавычек. Значение атрибута может содержать только (a-z и A-Z), цифры (0-9), дефисы (ASCII десятеричная 45), точку (ASCII десятеричная 46), символ подчёркивания (ASCII десятеричная 95) и двоеточие (ASCII десятеричная 58).
Мы рекомендуем использовать знак кавычек даже тогда, когда можно обойтись без него..

Названия атрибутов всегда нечувствительны к регистру.

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

Все атрибуты, определённые в этой спецификации, перечислены индексе атрибутов.

3.2.3  Ссылки-мнемоники

Ссылки-мнемоники это цифровые или символьные имена символов, которые могут быть включены в документ HTML. Они употребляются как ссылки на редко используемые или затруднительные для воспроизведения авторскими утилитами символы. Вы встретите такие ссылки-мнемоники в этом документе повсюду, они начинаются знаком "&" и заканчиваются точкой с запятой (;). Вот некоторые распространённые сочетания:

Мы детально обсуждаем ссылки-мнемоники HTML позже в разделе набор символов документа HTML. В этой спецификации есть также список символьных ссылок, которые могут употребляться в документах HTML 4.

3.2.4 Комментарии

Комментарии HTML  имеют следующий синтаксис:

<!-- это комментарий -->
<!-- и это тоже комментарий,
    занимающий более одной строки -->

Не допускаются пробелы между открывающим ограничителем объявления разметки ("<!") и открывающим ограничителем комментария ("--"), но разрешаются между закрывающим ограничителем комментария ("--")  и закрывающим ограничителем объявления разметки (">"). Обычная ошибка - включение внутрь комментария строки ("---"). Авторы должны исключить использование внутри комментариев двух или более смежных дефисов.

Информация комментариев не имеет специального значения (напр., ссылки-мнемоники не интерпретируются как таковые).

Обратите внимание, что комментарии это разметка.


3.3
  Как читать Определение Типа Данных (ОТД) HTML

Каждое объявление элемента или атрибута в этой спецификации сопровождается соответствующим фрагментом определения типа документа. Мы решили включать фрагменты ОТД в спецификацию вместо того, чтобы использовать более подходящие, но и более длинные и менее точные способы описания свойств элемента.
Этот учебник должен помочь читателям, не знакомым с SGML, разобраться в ОТД и понять технические детали этой спецификации HTML.

3.3.1 Комментарии в ОТД

Комментарии в ОТД могут быть одно- или многострочными. Комментарии в ОТД это текст, ограниченный парами знаков "--", например:

<!ELEMENT PARAM - O EMPTY       -- именованное значение свойства -->
Данный комментарий "именованное значение свойства" поясняет использование типа элемента PARAM. Комментарии в ОТД носят исключительно информативный характер.

3.3.2  Определения объектов-параметров

ОТД 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).

3.3.3  Объявление элементов

Как правило, ОТД HTML состоит из объявления типа элемента и его атрибута. Ключевое слово<!ELEMENT открывает объявление, а символ > закрывает. Между ними определяются:

  1. имя элемента;
  2. обязательно ли указывать теги элемента. Два дефиса после имени элемента означают, что начальный и конечный теги должны присутствовать. Один дефис и буква "O" означают, что конечный тег может отсутствовать. Две буквы "O" означают, что и начальный, и конечный теги могут отсутствовать;
  3. содержимое элемента, если есть. Допустимое для данного элемента содержимое называется моделью содержимого. Типы элементов, которые разработаны так, чтобы не иметь содержимого, называются пустыми элементами. Модель содержимого для таких типов элементов объявляется ключевым словом "EMPTY".

В этом примере:

    <!ELEMENT UL - - (LI)+>

В этом примере иллюстрируется объявление пустого типа элемента:

    <!ELEMENT IMG - O EMPTY>

Определение модели содержимого 

Модель содержимого указывает, что может содержать в себе объект данного типа элементов. Определение модели содержимого может включать:

Синтаксис спецификации модели содержимого элемента следующий. Обратите внимание, что данный список является упрощённым по сравнению с полным синтаксисом SGML и не адресует, напр., старшинство.

( ... )
Ограничивает группу.
A
A должно появляться только однократно.
A+
A должно появляться один раз или более.
A?
A должно появляться 0 или 1 раз.
A*
A может появляться 0 или более раз.
+(A)
A может появляться.
-(A)
A не должно появляться.
A | B
Может появиться A или B, но не оба вместе.
A , B
Оба A и B должны появиться в данном порядке.
A & B
Оба A и B должны появиться в любом порядке.

Вот некоторые примеры ОТД HTML:

   <!ELEMENT UL - - (LI)+>

Элемент UL должен содержать один или более элементов LI.

   <!ELEMENT DL    - - (DT|DD)+>

Элемент DL должен содержать один или более элементов DT или DD в любом порядке.

   <!ELEMENT OPTION - O (#PCDATA)>

Элемент OPTION может содержать только текст и мнемоники, такие как &amp; - это указано SGML типом данных #PCDATA.

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

В этом примере -(A) означает, что элемент A не может появляться в другом элементе A (т.е. якоря не могут быть вложенными).

   <!ELEMENT A - - (%inline;)* -(A)>

Заметьте, что тип элемента A является частью ОТД объекта-параметра "%inline;", но явно исключён, поскольку указано -(A).

Таким же образом, следующее объявление типа элемента FORM запрещает вложение форм:

   <!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>

3.3.4  Объявление атрибутов

Ключевое слово <!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;" расширяется так:

<!ENTITY % coreattrs
 "id          ID             #ПРЕДПОЛАГАЕТСЯ  -- уникальный идентификатор документа id --
  class       CDATA          #ПРЕДПОЛАГАЕТСЯ  -- список разделённых пробелами классов --
  style       %StyleSheet;   #ПРЕДПОЛАГАЕТСЯ  -- ассоциированная информация о стиле --
  title       %Text;         #ПРЕДПОЛАГАЕТСЯ  -- информативное название --"
  >

Объект-параметр "%attrs;" определён по соглашению, поскольку эти атрибуты определены для большинства типов элементов HTML.

Таким же образом ОТД определяет объект-параметр "%URI;" и расширяет его в строку "CDATA".

<!ENTITY % URI "CDATA"
    -- Uniform Resource Identifier,
       см. [URI]
    -->

Как показано в этом примере, объект-параметр "%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">

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