Вся
специфика HTML как одного из приложений SGML
выражена в особой формальной конструкции, называемой определением типа
документа (DocumentTypeDefinition, DTD).
В идеале DTD — высший авторитет во всем, что
касается синтаксиса той или иной версии HTML.
Им, к примеру, пользуются HTML-валидаторы — интерпретаторы
SGML,
проверяющие соответствие HTML-документа некоторому DTD.
Поскольку DTD для каждой версии HTML
зафиксировано в официальной спецификации языка,
в
самом документе приводить его не нужно, — однако любой HTML-документ
обязан ссылаться
на свое DTD с помощью тега !DOCTYPE
(стр. 29).
Хотя
синтаксис DTD мы в этой книге рассматривать не
будем, полезно знать, какая именно информация может храниться в определении
типа документа:
•
полный список допустимых элементов с указанием на обязательность для каждого из
них открывающего и закрывающего тегов;
•
полный список атрибутов для каждого элемента, с информацией об их
обязательности/факультативности и значениями по умолчанию;
•
иерархическая структура документа в виде информации о том, какие другие элементы,
в каком порядке и в каких сочетаниях (друг с другом и/или с обычным текстом)
могут встречаться внутри каждого из элементов.
Например,
в DTD
для HTML 4.0 указано, что у элемента HTML
можно опускать как открывающий, так и закрывающий теги (границы элемента
устанавливаются интерпретатором по контексту), а его содержимое должно
состоять из элементов HEAD и BODY,
идущих именно в таком порядке. Элемент OL
(нумерованный список) обязан иметь как открывающий, так и закрывающий теги, а
содержимое его должно состоять из одного или нескольких следующих друг за
другом элементов LI. DTD в
языке XML на этом уровне рассмотрения имеет только одно существенное отличие от
DTD в SGML (и
HTML):
все элементы XML-до-кумента без исключения обязаны
иметь и открывающий, и закрывающий тег.
Важно понимать, что ни в SGML, ни в XMLDTD не имеет никаких средств для задания семантики тегов, — иными словами, DTD не дает ответа на
вопрос, что означает каждый
тег. В каком-то смысле идеология SGML следует Людвигу Витгенштейну, которому принадлежит
высказывание: «Themeaningofawordisitsuse» («Значение слова — это то, как оно употребляется»). Тот
факт, к примеру, что тег I включает курсивное начертание, формально средствами SGML не выразим, — он
лишь подразумевается авторами
языка HTML и
указывается в комментариях или в сопроводительной документации к HTMLDTD.
Именно поэтому путь, избранный в HTML, — жесткое закрепление за каждым из тегов (набор которых
ограничен) некоторой «рекомендуемой» роли и параметров форматирования — несмотря
на свою простоту, плохо укладывается в рамки идеологии SGML и влечет за собой неприятные последствия. Если семантику
тега невозможно определить формально, то нет ничего удивительного в том, что
эффект лаже простейших тегов иногда сильно различается у разных броузеров.
Абстрактный вопрос «что делает
50
такой-то тег», по сути, лишен смысла — можно только
выяснять, какой результат дает применение этого тега в том или ином броузере.
Если в SGML
каждый документ обязан иметь свое DTD, а у HTML
есть одно DTD на всех, то XML представляет собой
компромисс: документ может иметь (или ссылаться на) DTD, а
может и обходиться без DTD. В последнем случае каждый
новый тег и атрибут определяются самим фактом своего употребления. Таким
образом, для XML-документов существует два уровня
соответствия стандарту: документы, не имеющие DTD,
но удовлетворяющие всем другим требованиям синтаксиса XML, называют правильно
структурированными (well-formed), чтобы
отличить их от документов валидных (valid), имеющих в своем составе DTD
(или ссылку на внешнее DTD).
Правильно
структурированные документы, хотя и уступают по «правильности» документам
валидным, годятся для большинства практических случаев. Это значит, что вы
можете сразу же начать описывать структуру вашего документа на «почти
человеческом» языке, выдумывая теги на ходу и заботясь лишь об их правильной
вложенности:
<ПРЕДЛОЖЕНИЕ>
<ПОДЛЕЖАЩЕЕ>
<СУЩЕСТВИТЕЛЬНОЕ>
мама </СУЩЕСТВИТЕЛЫЮЕ>
</ПОДЛЕЖАЩЕЕ>
<СКАЗУЕМОЕ
тип="простое"> <ГЛАГОЛ>мыла </ГЛАГОЛ>
</СКАЗУЕМОЕ>
<ДОПОЛНЕНИЕ
тип="прямое">
<СУЩЕСТВИТЕЛЬНОЕ>
раму </СУЩЕСТВИТЕЛЬНОЕ>
</ДОПОЛНЕНИЕ>
</ПРЕДЛОЖЕНИЕ>
Как
видно из этого примера, имена тегов и атрибутов можно писать и по-русски. Опыт HTML
показал, сколь важна тщательная и своевременная интернационализация всех
аспектов языка, претендующего на какую-то роль в Интернете. Поэтому создатели
XML позаботились, в частности, о том, чтобы в именах тегов и атрибутов можно
было пользоваться не только латинскими буквами, но и кириллицей, иероглифами и
вообще любыми символами из репертуара Unicode, которые считаются
«буквами» хотя бы в одном языке или системе письменности. Такая разметка
позволит интерпретатору XML порубить документ на кусочки в соответствии с его
теговой структурой. После этого в действие вступает другое приложение — его
задачей может быть, например, автоматическое индексирование документа,
занесение его в базу данных
или
(чаше всего) форматирование в соответствии с приложенной к документу стилевой
спецификацией. (В нашем примере можно было бы, скажем, раскрасить разные части
речи разными цветами.) Однако важно понимать, что все эти задачи лежат уже за
пределами собственно языка XML, — который, таким образом, свободен от заботы о
визуальном (или каком-либо ином) представлении документа и позволяет
сфокусироваться на его логической структуре.
Возможность использовать
произвольные теги означает, в частности, что любой HTML-документ
очень легко преобразовать в XML. Изменения, требуемые для этого
преобразования, немногочисленны и сугубо формальны:
•
все значения атрибутов должны быть взяты в кавычки;
•
регистр букв в открывающих и закрывающих тегах должен совпадать (в отличие от HTML,
язык XML чувствителен к регистру);
• все элементы
должныиметь открывающийизакрывающийтег.Этоотноситсянетолькокэлементам с факультативными
тегами (такими как упоминавшийся выше элемент HTML),
но и к пустым
элементам, которые в HTML
имеют только
открывающий тег. Например, тег IMG
придется записывать так: <IMGalt=""
src="e.gif"></IMG>
XML также допускает особую сокращенную запись для пустых элементов: <IMGalt="" src="e.gif"/>
Существуют
утилиты, переводящие HTML в XML «тег в тег» с
соблюдением всех перечисленных выше правил. Толку от такой конверсии, правда,
немного: хотя результат ее будет «правильно структурированным» документом с
точки зрения интерпретатора XML, его разметка не станет ни на йоту более
структурной. Только заменяя на соответствующие логические теги унифицированные HTML-блоки
(стр. 45), имеющие наряду с форматирующей еще и определенную структурную функцию,
можно получить на выходе осмысленный XML-код, обнажающий
содержательную основу документа и способный работать с любой подключенной
стилевой спецификацией.
Создатели
XML прекрасно
понимали, что простота и изящество логического подхода к разметке имеют
оборотную сторону — язык, не предоставляющий достаточно мощных и притом
стандартизированных средств определения семантики тегов, вряд ли сможет
составить серьезную конкуренцию HTML. Поэтому с момента появления
черновой спецификации XML в ноябре 1996 года разработчики заняты в основном
выбором и стандартизацией расширений языка — надстроек над XML, которые
позволили бы формально описывать различные семантические аспекты тегов.
В
отличие от HTML, многочисленные «расширения» которого
больше похожи на заплаты на расползающейся ткани, модульная структура XML
является одним из важнейших преимуществ этого языка. Авторы XML прилагают все
усилия к тому, чтобы логический базис и семантические надстройки удобно стыковались,
не теряя при этом как формальной, так и содержательной независимости друг от
друга.