Содержание
В этом разделе документа Вы познакомитесь с SGML и узнаете о его отношении к HTML. Полное описание SGML не входит в этот стандарт (см. [ISO8879]).
SGML - это система определения языков разметки. Авторы размечают свои документы, представляя информацию о структуре, представлении и семантике в одном документе. HTML является одним из примеров языка разметки. Вот пример документа на языке HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<HTML>
<HEAD>
<TITLE>My first HTML document</TITLE>
</HEAD>
<BODY>
<P>Hello world!
</BODY>
</HTML>
Документ HTML состоит из раздела заголовка (здесь - между тэгами <HEAD> и </HEAD>) и тела (здесь - между заголовками <BODY> и </BODY>). Заголовок документа отображается в заголовке (вместе с другой информацией о документе), а содержимое документа находится в теле. В этом примере тело документа состоит только из одного абзаца, помеченного <P>.
Каждый язык разметки, определенный в SGML, называется приложением SGML. Приложение SGML характеризуется:
Спецификация HTML 4.0 включает объявление SGML , три определения типа документов (описание их см. в разделе информация о версии HTML ) и список character references.
В следующих разделах Вы познакомитесь с конструкциями SGML, используемыми в HTML.
В приложении перечислены некоторые функции SGML, которые не поддерживаются средствами HTML и агентами пользователей, и использования которых следует избегать.
Определение типа документа SGML объявляет типы элементов, представляющие структуры или желательное поведение. HTML включает типы элементов, представляющие абзацы, гипертекстовые ссылки, списки, таблицы, изображения и т.д.
Каждое объявление типа элемента обычно включает три части: начальный тэг, содержимое и конечный тэг.
Имя элемента отображается в начальном тэге (пишется <имя-элемента>) и в конечном тэге (пишется </имя-элемента>); не забывайте про слеш перед именем элемента в конечном тэге. Например, начальные и конечные тэги элемента UL определяют список:
<UL>
<LI><P>...элемент списка 1...
<LI><P>...элемент списка 2...
</UL>
Некоторые типы элементов HTML позволяют авторам опускать конечные тэги (например, типы элементов P and LI). Несколько типов элементов также позволяют опускать начальные тэги; например, HEAD и BODY. HTML DTD указывает для каждого типа элемента, являются ли начальный и конечный тэги обязательными.
Некоторые типы элементов HTML не имеют содержимого. Например, элемент перехода на следующую строку BR не имеет содержимого; его роль - прерывание строки текста. Такие пустые элементы никогда не имеют конечных тэгов. Определение типа документа и текст спецификации указывают, является ли тип элемента пустым (не имеет содержимого) или, если он может иметь содержимое, что является допустимым содержимым.
Имена элементов всегда учитывают регистр.
Информацию о правилах, управляющих элементами, (например, что они могут быть вложенными соответствующим образом, конечный тэг закрывает все опущенные начальные тэги вплоть до соответсвующего ему начального тэга (раздел 7.5.1) и т.д.) см. в стандарте SGML.
Например, следующий абзац:
<P>Это первый абзац.</P>
...элемент блока...
можно перезаписать без конечного тэга:
<P>Это первый абзац.
...элемент блока...
поскольку начальный тэг <P> закрывается следующим элементом блока. Точно так же, если абзац включен в элемент блока, например:
<DIV>
<P>Это абзац.
</DIV>
конечный тэг включающего элемента блока (здесь - </DIV>) служит также конечным тэгом открытого начального тэга <P>.
Элементы - это не тэги. Некоторые люди называют элементы тэгами (например, "тэг P "). Помните, что элемент - это одно, а тэг (начала или конца, неважно) - другое. Например, элемент HEAD всегда присутствует, даже если начальный и конечный тэги HEAD отсутствуют.
Все типы элементов, объявленные в этой спецификации, перечислены в указателе элементов.
С элементами могут быть связаны свойства, называемые атрибутами, которые могут иметь значения (стандартные или устанавливаемые авторами или сценариями). Пары атрибут/значение помещаются перед закрывающей скобкой ">" начального тэга элемента. В начальном тэге элемента может быть любое число (допустимых) пар атрибут/значение, разделенных пробелами. Они могут указываться в любом порядке.
В данном примере для элемента H1 установлен атрибут id:
<H1 id="section1">
Это определенный заголовок, спасибо атрибуту id
</H1>
По умолчанию в SGML необходимо, чтобы все значения атрибутов были разделены с помощью двойных (десятичный код ASCII 34) или одинарных кавычек (десятичный код ASCII 39). Одинарные кавычки могут включаться в значение атрибута, если значение отделяется двойными кавычками, и наоборот. Авторы могут также использовать цифровые ссылки на символы для представления двойных (") и одинарных кавычек ('). Для двойных кавычек авторы могут также использовать character entity reference ".
В определенных случаях авторы могут указывать значение атрибута без кавычек. Значение атрибута может включать только буквы (a-z и A-Z), цифры (0-9), знаки переноса (десятичный код ASCII 45) и точки (десятичный код ASCII 46). Рекомендуется всегда использовать кавычки.
Имена атрибутов всегда учитывают регистр
Значения атрибутов обычно учитывают регистр. Определение кажого атрибута в списке атрибутов указывается, учитывает ли значение регистр.
Список всех атрибутов, определенных в этой спецификации, приводится в указателе атрибутов.
Ссылки на символы - это числовые или символьные имена символов, которые могут быть включены в документ HTML. Они удобны для обращения к редко используемым символам или к символам, которые трудно или невозможно вводить в средствах разработки документов. Вы увидите ссылки на символы в этом документе; они начинаются со знака "&" и заканчиваются точкой с запятой (;). Вот некоторые примеры:
Ссылки на символы в HTML подробно обсуждаются дальше в этом разделе под заголовком набор символов документа HTML. В спецификации также содержится список ссылок на символы, которые могут использоваться в документах в формате HTML 4.0.
Комментарии в HTML имеют следующий синтаксис:
<!-- это комментарий -->
<!-- это тоже комментарий,
он занимает несколько строк -->
Проблемы между открывающим разделителем разметки ("<!") и открывающим разделителем комментария ("--") недопустимы, но их можно использовать между закрывающим разделителем комментария ("--") и закрывающим разделителем разметки (">"). Распространенной ошибкой является включение строки символов переноса ("---") в комментарий. Следует избегать использования в комментариях двух или более символов переноса.
Информация в комментариях не имеет специального значения (например, ссылки на символы не интерпретируются).
Каждое объявление элемента и атрибута в этой спецификации сопровождается фрагментом его определения типа документа. Мы решили включить фрагменты DTD в спецификацию вместо того, чтобы искать более доступные, но более длинные и менее точные средства описания свойств элементов. При помощи следующего учебника читатели, не знакомые с SGML, смогут научиться читать DTD и понимать технические подробности спецификации HTML.
В DTD комментарии могут занимать несколько строк. В DTD комментарии отделяются парой меток "--", например,
<!ELEMENT PARAM - O EMPTY -- значение именованного свойства -->
HTML DTD начинается с ряда определений parameter entity. Определение parameter entity определяет макрос, на который можно ссылаться в любом месте DTD. Эти макросы не отображаются в документах HTML, они отображаются только в DTD. Другие типы макросов, называемые ссылками на символы, могут использоваться в тексте документа в формате HTML или в значениях атрибутов.
Когда на parameter entity ссылаются в DTD по имени, он разворачивается в строку.
Определение parameter entity начинается с ключевого слова <!ENTITY %, за которым следует имя entity, строка в кавычках, в которую разворачивается entity и наконец закрывающий >. Экземпляры parameter entities в DTD начинаются со знака "%", затем идет имя parameter entity и заканчивается необязательным символом ";".
В следующем примере определяется, в какую строку бедет разворачиваться "%fontstyle;".
<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">
Строка, в которую расворачивается parameter entity, может содержать другие имена parameter entity. Эти имена разворачиваются рекурсивно. В следующем примере "%inline;" parameter entity включает "%fontstyle;", "%phrase;", "%special;" и "%formctrl;" parameter entities.
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
Вы часто будете встречать в HTML DTD два DTD entities: "%block;" "%inline;". Они используются, если модель содержимого включает block-level and inline elements соответственно (определенные в разделе глобальная структура документа HTML).
HTML DTD состоит из объявлений типов элементов и их атрибутов. Объявление начинается с ключевого слова <!ELEMENT и заканчивается символом >. Между ними указываются:
В этом примере:
<!ELEMENT UL - - (LI)+>
В этом примере показано объявление пустого типа элемента:
<!ELEMENT IMG - O EMPTY>
Модель содержимого описывает, что может содержаться в экземпляре типа элемента. Определения модели содержимого могут включать:
Модель содержимого элемента указывается с использованием следующего синтаксиса:
Вот некоторые примеры HTML DTD:
<!ELEMENT UL - - (LI)+>
Элемент UL должен содержать один или несколько элементов LI.
<!ELEMENT DL - - (DT|DD)+>
Элемент DL должен содержать один или несколько элементов DT или DD в любом порядке.
<!ELEMENT OPTION - O (#PCDATA)>
Элемент OPTION может содержать только текст и такие entities как & -- это определяется типом данных SGML #PCDATA.
Некоторые типы элементов HTML используют дополнительную функцию SGML для исключения элементов из модели содержимого. Исключенным элементам предшествует символ переноса. Явные исключения имеют приоритет по отношению к допустимым элементам.
В этом примере -(A) означает, что элемент A не может находиться в другом элементе A (то есть ссылки не могут быть вложенными).
<!ELEMENT A - - (%inline;)* -(A)>
Помните, что тип элемента A является частью DTD parameter entity "%inline;", но явно исключается выражением -(A).
Точно так же следующее объявление типа элемента FORM запрещает вложенные формы:
<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>
Объявление атрибутов, которые может иметь элемент, начинается с ключевого слова <!ATTLIST. За ним следует имя элемента in question, список определений атрибутов и закрывающий символ >. Каждое определение атрибута - это тройка, определяющая:
В этом примере атрибут имя определен для элемента 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}.
Определения атрибутов могут также содержать ссылки на parameter entity.
В этом примере мы видим, что список определений атрибутов для элемента LINK начинается с "%attrs;" parameter entity.
<!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 -- >
Start tag: required, End tag: forbidden
"%attrs;" parameter entity определен следующим образом:
<!ENTITY % attrs "%coreattrs; %i18n; %events;">
"%coreattrs;" parameter entity в определении "%attrs;" разворачивается следующим образом:
The "%attrs;" parameter entity определен для удобства, поскольку эти атрибуты определены для большинства типов элементов HTML.
Таким же образом DTD определяет "%URI;" parameter entity как расширение строки "CDATA".
Как показано в этом примере, parameter entity "%URI;" предоставляет читателям DTD больше информации, чем для типа данных, ожидаемого для этого атрибута. Похожие entities определены для "%Color;", "%Charset;", "%Length;", "%Pixels;" и т.д.
Некоторые атрибуты играют роль булевых переменных (например, атрибут selected для элемента OPTION). ИХ наличие в начальном тэге элемента подразумевает, что значением атрибута является "истина". Их отсутствие означает "ложь".
Булевы атрибуты могут принимать только одно значение: соственно имя атрибута (например, selected="selected").
В этом примере атрибут selected определяется как булев.
selected (selected) #IMPLIED -- reduced inter-item spacing --
Для атрибута устанавливается значение "истина", поскольку он находится в начальном тэге элемента:
<OPTION selected="selected">
...contents...
<OPTION>
В HTML булевы атрибуты могут быть в минимизированной форме -- в начально тэге элемента находится только значение атрибута. Таким образом, selected можно установить, написав:
<OPTION selected>
вместо:
<OPTION selected="selected">
Авторам следует знать, что многие агенты пользователей распознают только минимизированную форму булевых атрибутов и не распознают полную.