3 Об SGML и HTML

Содержание

  1. Введение в SGML
  2. Конструкции SGML используемые в HTML
    1. Элементы
    2. Атрибуты
    3. Указатели символов
    4. Коментарии
  3. Как читать HTML DTD
    1. Коментарии DTD
    2. Определения параметрических сущностей
    3. Декларации элементов
    4. Декларации атрибутов

Настоящий раздел документа представляет SGML и обсуждает его отношение к HTML. Полное обсуждение SGML опущено в пользу стандарта (см. [ISO8879]).

3.1 Введение в SGML

SGML представляет собой систему для определения языков разметки. Авторы размечают свои документы представляя структурную, художественную и семантическую информацию по ходу содержания. HTML представляет конкретный пример языка разметки. Приведем пример документа написанного на HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
     "http://www.w3.org/TR/REC-html40/strict.dtd">
<HTML>
   <HEAD>
      <TITLE>Мой первый документ на HTML</TITLE>
   </HEAD>
   <BODY>
      <P>Hello world!
   </BODY>
</HTML>

Документ написанный на HTML разделяется на заголовок (в данном примере, между <HEAD> и </HEAD>) и тело (в данном примере, между <BODY> and </BODY>). Название документа приводится в заголовке (вместе с другой информацией о документе), а содержание документа приводится в теле. Тело в данном примере содержит лишь один абзац, помеченый ярлыком <P>.

Каждый язык разметки сформулированый в терминах SGML называется приложением SGML. Как правило, приложение SGML характеризуется следуюшим:

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

Спецификация HTML 4.0 включает декларацию SGML, три определения типа документа (описание см. в разделе информация о версии HTML) и список указателей символов.

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

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

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

3.2.1 Элементы

Определение типа документа (DTD) SGML объявляет типы элементов что представляют труктуры или желаемое поведение. HTML включает типы элементов для представления абзацев, гипертекстовых ссылок, списков, таблиц, изображений, и т.д.

Каждое объявление типа элемента как правило описывает три части: начальный ярлык, содержание и заключительный ярлык.

Название элемента указывается в начальном ярлыке (записывается <element-name>) и в заключительном ярлыке (записывается </element-name>); обратите внимание на косую черту перед названием элемента в заключительном ярлыке. Например, начальный и заключительный ярлыки элемента типа UL разграничивают пункты в списке:

<UL>
<LI><P>...list item 1...
<LI><P>...list item 2...
</UL>

Некоторые типы элементов в HTML позволяют авторам опускать заключительные ярлыки (например, P и LI типы элементов). Несколько типов элементов так-же позволяют опускать начальные ярлыки; например, HEAD и BODY. HTML DTD указывает для каждого типа элементов является ли начальный и заключительный ярлыки обязательными.

Некоторые типы HTML элементов не имеют содержания. Например, элемент переноса строки BR не имеет содержания; он служит лишь для того чтобы закончить строку текста. Подобные пустые (empty) элементы никогда не имеют заключительных ярлыков. Определение типа документа и текст спецификации указывают является ли элемент пустым (не имеет содержания) или, если он может обладать содержанием, то что является законным содержанием.

Имена элементов всегда нечуствительны к регистру.

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

Например, следующий абзац:

<P>Это первый абзац.</P>
...блочный элемент...

может быть переписан без своего заключительного ярлыка:

<P>Это первый абзац.
...блочный элемент...

так как начальный ярлык <P> закрывается последующим блочным элементом. Аналогично, если абзац заключается в блочном элементе, как в:

<DIV>
<P>Это абзац.
</DIV>

то заключительный ярлык обертывающего блочного элемента (в данном случае, </DIV>) подразумевает наличие заключительного ярлыка открытого начального ярлыка <P>.

Элементы не являются ярлыками. Некоторые люди называют элементы ярлыками (например "ярлык P"). Следует помнить, что элемент -- это одно, а ярлык (будь то начальный или залючительный ярлык) -- другое. В частности, элемент HEAD присутствует всегда, не смотря на то что как начальный так и конечный ярлыки HEAD могут отсутствовать в разметке.

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

3.2.2 Атрибуты

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

В данном примере, атрибут id указан для элемента H1:

<H1 id="section1">
This is an identified heading thanks to the id attribute
(Этот заголовок идентифицирован при помощи атрибута id)
</H1> 

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

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

Имена атрибутов всегда нечуствительны к регистру

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

Все атрибуты определенные в настоящей спецификации перечислены в указателе атрибутов.

3.2.3 Указатели символов

Символьные ссылки представляют собой численные или буквенные имена для символов которые могут включатся в документ на HTML. Они полезны для указания на редко встречающиеся символы или символы которые трудно или невозможно ввести при помощи програмного обеспечения используемого автором. Вам будут встречатся символьные ссылки повсеместно на протяжении данного документа; они начинаются со знака "&" и заканчиваются точкой с запятой (;). Наиболее распространенные примеры включают:

Мы подробно обсудим символьные ссылки HTML в разделе о наборе символов документа на HTML. Спецификация содержит также список символьных ссылок которые могут встречатся в документах на HTML версии 4.0.

3.2.4 Коментарии

HTML comments have the following syntax:

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

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

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

3.3 Как читать DTD для HTML

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

3.3.1 Коментарии в DTD

Коментарии в DTD могут занимать одну или болеее строк. Коментарии в DTD ограничеваются парой меток "--", например

<!ELEMENT PARAM - O EMPTY       -- именованое значение свойства -->
Здесь, коментарий "именованое значение свойства" объясняет использование элемента типа PARAM. Коментарии в DTD служат только для информации.

3.3.2 Определения параметрических сущностей

DTD для HTML начинается с набора определений параметрических сущностей. Определение параметрической сущности определяет нечто вроде макроса которое может быть использовано и развернуто где-то б другом месте DTD. Эти макросы не могут встречатся в документах на HTML, только в DTD. Другие типы макросов, так называемые символьные указатели, могут быть использованы в тексте документов на HTML или внутри значений атрибутов.

Если параметрическая сущность указывается по имени в DTD, то она разворачивается в строку.

Определение параметрической сущности начинается с ключевого слова <!ENTITY % за которым следуют имя сущности, строка в кавычках в которую сущность разворачивается и, наконец, закрывающий уголок >. В случае применения в DTD параметрические сущности начинаются со знака "%", затем следует имя сущности и заканчиваются на ";", которая может опускатся.

Следующий пример определяет строку в которую разворачивавтся параметрическая сущность "%fontstyle;.

<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">

Строка в которую разворачивается параметрическая сущность может содержать имена других параметрических сущностей. Эти имена разворачиваются рекурсивно. В следующем примере параметрическая сущность "%inline;" определяется с использованием параметрических сущностей "%fontstyle;", "%phrase;", "%special;" и "%formctrl;".

<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

Следующие две сущности DTD будут часто встречатся в DTD для HTML: "%block;" "%inline;". Они используются когда модель содержания включает блочные и строчные элементы соответственно (определенные в разделе о глобальной структуре документа на HTML).

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

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

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

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

    <!ELEMENT UL - - (LI)+>

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

    <!ELEMENT IMG - O EMPTY>

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

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

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

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

Приведем насколько примеров из DTD для 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 является частью параметрической сущности DTD "%inline;", но он явно исключен благодаря -(A).

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

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

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

Объявление атрибутов которые может принимать элемент начинается с ключевого слова <!ATTLIST. За тем следуют название элемента о котором идет речь, список определений атрибутов и закрывающий уголок >. Каждое определение атрибута это тройка, которая определяет:

В этом примере, атрибут name [имя] определяется для элемента MAP. Атрибут является необязательным для данного элемента.

<!ATTLIST MAP
  name        CDATA     #IMPLIED
  >

Тип значений разрешенных для атрибута указан как CDATA, один из типов данных SGML. CDATA это текст который может содержать указатели символов.

За дальнейшей информацией о типах данных "CDATA", "NAME", "ID", и других обращайтесь к разделу "Типы данных HTML".

Следующие примеры представляют несколько определений атрибутов:

rowspan     NUMBER     1         -- number of rows spanned by cell --
http-equiv  NAME       #IMPLIED  -- HTTP response header name  --
id          ID         #IMPLIED  -- document-wide unique id -- 
valign      (top|middle|bottom|baseline) #IMPLIED

Атрибут rowspan требует значений типа NUMBER [число]. Значение по умолчанию указано явно и равно "1". Необязательный атрибут http-equiv требует значений типа NAME [имя]. Необязательный атрибут id требует значений типа ID. Необязательный атрибут valign может принимать значения только из следующего набора: {top, middle, bottom, baseline}.

Сущности DTD в определениях атрибутов 

Определения атрибутов могут также содержать указатели параметрических сущностей.

В этом примере, мы видим, что список определений атрибутов для элемента LINK начинается с параметрической сущности "%attrs;".

<!ELEMENT LINK - O EMPTY               -- a media-independent link -->
<!ATTLIST LINK
  %attrs;                              -- %coreattrs, %i18n, %events --
  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
  href        %URI;          #IMPLIED  -- URI for linked resource --
  hreflang    %LanguageCode; #IMPLIED  -- language code --
  type        %ContentType;  #IMPLIED  -- advisory content type --
  rel         %LinkTypes;    #IMPLIED  -- forward link types --
  rev         %LinkTypes;    #IMPLIED  -- reverse link types --
  media       %MediaDesc;    #IMPLIED  -- for rendering on these media --
  >

Начальный ярлык: обязателен, Заключительный ярлык: запрещен

Параметрическая сущность "%attrs;" определяется следующим образом:

<!ENTITY % attrs "%coreattrs; %i18n; %events;">

В свою очередь, параметрическая сущность "%coreattrs;" разворачивается в:

<!ENTITY % coreattrs
 "id          ID             #IMPLIED  -- document-wide unique id --
  class       CDATA          #IMPLIED  -- space separated list of classes --
  style       %StyleSheet;   #IMPLIED  -- associated style info --
  title       %Text;         #IMPLIED  -- advisory title/amplification --"
  >

Параметрическая сущность "%attrs;" определена для удобства так как эти атрибуты определены для большинства типов элементов в HTML.

Аналогично DTD определяет параметрическую сущность "%URI;" которая разворачивается в строку "CDATA".

<!ENTITY % URI "CDATA"
    -- a Uniform Resource Identifier,
       see [URI]
    -->

Как видно из этого примера, параметрическая сущность "%URI;" предоставляет читателям больше информации о том какого типа данные ожидаются для атрибута. Похожие сущности определены для [цвета] "%Color;", [набора символов] "%Charset;", [длины] "%Length;", [пикселей] "%Pixels;", и т.п.

Булевы атрибуты 

Некоторые атрибуты играют роль булевых переменных (например, атрибут selected [выбран] для элемента OPTION). Их появление на начальном ярлыке элемента означает что значение атрибута есть "правда". Их отсутствие означает значение "ложь".

Булевы атрибуты могут законно принимать единственное значение: имя самого атрибута (например, selected="selected").

Этот пример определяет атрибут selected как булев атрибут.

selected     (selected)  #IMPLIED  -- reduced inter-item spacing --

Атрибут принимает значение "правда" так как он указан на начальном ярлыке элемента:

<OPTION selected="selected">
...содержание...
<OPTION>

В HTML, булевы атрибуты могут указыватся в сокращенной форме -- значение атрибута приводится само по себе на начальном ярлыке элемента. Таким образом, атрибут selected может быть установлен посредством:

<OPTION selected>

вместо:

<OPTION selected="selected">

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

1