Глава 1.11. XHTML: язык HTML как XML-приложение

1.11.1. Введение в XHTML

В январе 2000 г. W3C опубликовал рекомендацию XHTML 1.0 по переформулировке спецификации HTML 4 как XML-приложения. Язык XML будет нами подробно рассмотрен в Части VIII; здесь же приводится только резюме упомянутой рекомендации. В сравнении с HTML 4, XHTML обладает следующими преимуществами:

  • XHTML-документы соответствуют стандарту XML, и, следовательно, они могут просматриваться, редактироваться и проверяться на синтаксическую правильность стандартными средствами поддержки языка XML.
  • XHTML-документы могут отображаться как существующими обозревателями HTML-документов, так и новыми обозревателями, поддерживающими стандарт XHTML.
  • XHTML-документы могут обращаться к сценариям и аплетам, основанным на объектной модели документов (DOM).

С практической точки зрения преимущества XHTML таковы:

  • И разработчики документов, и разработчики обозревателей постоянно ищут новые способы выражения своих идей с помощью новых HTML-тегов. XML обеспечивает единый и простой способ создания новых элементов языка и их дополнительных атрибутов. XHTML призван унифицировать такие расширения языка HTML посредством XHTML-модулей, которые будут поддерживать комбинации существующих элементов HTML с новыми элементами при разработке и отображении документов.
  • Постоянно возникают все новые способы и средства доступа к Сети: карманные компьютеры и телевизионные приставки, сотовые телефоны и пейджеры. По некоторым оценкам, к 2002 г. 75% просмотра Веб-страниц будет осуществляться с помощью этих альтернативных средств. XHTML был разработан с ориентацией на обобщенный обозреватель, который в сочетании с механизмами словарей метаданных должен обеспечить оптимальное преобразование содержимого документа при его отображении, с тем, чтобы, в конце концов, перейти к разработке таких документов, которые будут адекватно отображаться любым обозревателем, поддерживающим стандарт XHTML.

По мнению создателей языка HTML, он, несмотря на его ошеломляющий успех, за прошедшее десятилетие полностью исчерпал себя и превратился в труднообозримого монстра, поддержка которого из-за чрезмерно разросшегося набора тегов становится все более затруднительной. По этой причине история HTML заканчивается его четвертой версией; HTML 5 никогда создан не будет — точнее говоря, таковым можно считать XHTML 1.0, который начинает новую эпоху языков для Веб-документов, основанную на едином протоязыке XML, обеспечивающем своим приложениям расширяемость и переносимость.

1.11.2. Структура XHTML-документа

XHTML-документ имеет следующую структуру:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Заголовок документа</title>
</head>
<body>
...
</body>
</html>

Из этого примера видно, что XHML-документ состоит из следующих компонентов:

  • Декларация XML-документа (первая строка примера). Эта строка не является обязательной согласно стандарту XML, но W3C рекомендует всегда включать ее в начало XHTML-документа. Если же кодировка символов документа отлична от UTF-8 или UTF-16, то XML-декларация становится обязательной и должна содержать название кодировки символов в атрибуте encoding.
  • Декларация типа документа (вторая строка примера). Эта декларация является обязательной и может принимать одно из трех значений, которые соответствуют трем декларациям типов HTML-документов:
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
      "DTD/xhtml1-strict.dtd">
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "DTD/xhtml1-transitional.dtd">
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
      "DTD/xhtml1-frameset.dtd">
  • Корневой элемент документа (остальные строки примера). Этим элементом является html с обязательным атрибутом xmlns, задающим пространство имен XHTML-документа. Значением xmlns должна быть строка "http://www.w3.org/1999/xhtml". Кроме  того, для задания языка документа должны использоваться и атрибут lang, и атрибут xml:lang, как показано в примере.

1.11.3. Отличия от HTML

Поскольку XHTML-документы являются XML-приложениями, на их синтаксис накладывается ряд дополнительных ограничений, которые выражаются в том, что XHTML-документы должны быть правильно оформлены в понимании стандарта XML. Это означает, что:

  • Каждый элемент должен иметь конечный тег, даже если стандарт HTML говорит, что он не обязателен. Если элемент не имеет конечного тега и содержимого, то его начальный тег должен оканчиваться на />, например <br />, <hr />, <img src="picture.jpg" alt="рисунок" />. Пробел перед дробной чертой не обязателен, но рекомендуется для совместимости с сегодняшними Веб-обозревателями.
  • Элементы должны либо следовать друг за другом, либо быть вложены один в другой, как это было рекомендовано в п. 1.1.2.1, хотя до сих пор Веб-обозреватели либерально относились к неправильному вложению элементов друг в друга.
  • Названия элементов и атрибутов HTML должны писаться строчными буквами, т. к. язык XML различает регистры, и в нем <body> и <BODY> — это различные теги.
  • Значения атрибутов всегда должны заключаться в кавычки (ср. п. 1.1.2.2). Не допускается краткая запись атрибутов вида <option selected>. Атрибут всегда должен иметь значение, в данном случае: <option selected="selected">.
  • Значения атрибутов нормализуются согласно стандарту XML. Это означает, что из них удаляются начальные и конечные пробелы, а каждая последовательность пробелов внутри значения атрибутов (включая разрывы строк) заменяется на один символ пробела.
  • Если элементы style или script содержат специальные символы, то их содержимое следует заключать в маркированную секцию CDATA, иначе процессор XML преобразует специальные символы в их эквиваленты до обработки обозревателем соответствующей таблицы стилей или сценария:
    <script>
     <![CDATA[
     …содержимое сценария…
     ]]>
     </script>

    Кроме того, процессор XML удаляет все комментарии из текста документа. Поэтому исторически сложившая практика "прятать" содержимое таблиц стилей и сценариев внутри комментариев не работает в XHTML. Единственный способ избежать их предварительной обработки процессором XML состоит в использовании внешних таблиц стилей и сценариев.

  • Атрибут name элементов a, form, frame, iframe, img и map объявлен в XHTML морально устаревшим; вместо него должен использоваться атрибут id. Более того, всюду в XHTML-документах для создания закладок следует пользоваться атрибутом id, например: <a id="myid">…</a>.

1.11.4. Обеспечение совместимости

Для того, чтобы XHTML-документ правильно отображался Веб-обозревателями, рекомендуется соблюдать следующие правила:

  • Поскольку XML-приложения пока не имеют зарегистрированного типа MIME, для XHTML-документов следует использовать тип "text/html" в метаописателе <META http-equiv="Content-Type" content="text/html; charset=windows-1251" />. Для задания кодировки символов документа следует указывать и этот метаописатель, и XML-декларацию <?xml version="1.0" encoding="WINDOWS-1251"?>. Помните, что XML-декларация имеет приоритет перед HTML-декларацией кодировки символов.
  • Для задания языка элемента должны использоваться и атрибут lang, и атрибут xml:lang, причем атрибут xml:lang имеет приоритет.
  • Если значение атрибута содержит символ амперсанта "&", то его следует заменить на соответствующий специальный символ &amp;. Например, если атрибут href элемента указывает на CGI-сценарий, принимающий параметры, то он должен записываться как http://my.site.dom/cgi-bin/myscript.pl?class=guest&amp;name=user, а не http://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user.

При использовании каскадных таблиц стилей следует помнить, что синтаксический разбор свойств стилей для HTML-документов и XML-документов производится по-разному. Для того, чтобы эти различия меньше влияли на отображение ваших документов, соблюдайте следующие правила:

  • Названия элементов и атрибутов CSS должны писаться строчными буквами.
  • Если ваша таблица стилей содержит свойства для элемента tbody, то таблицы в XHTML-документе должны явно содержать этот элемент (HTML добавляет его по умолчанию, а XML нет).
  • Обращайте внимание на те случаи, когда стандарт CSS по-разному определяет правила разбора свойств для HTML-документов и для XML-документов.