XHTML
XHTML (англ. Extensible Hypertext Markup Language — Расширяемый язык разметки гипертекста) — язык разметки веб-страниц, по возможностям сопоставимый с HTML, созданный на базе XML. Как и HTML, XHTML соответствует спецификации SGML, поскольку XML является её подмножеством. Вариант XHTML 1.1 одобрен в качестве Рекомендации Консорциума Всемирной паутины (W3C) 31 мая 2001 года.
Стандарт XHTML построен не как самодостаточное описание языка, а как перечень различий между HTML 4.01 и XHTML.
Различия между XHTML и HTML
Основное различие между HTML и XHTML состоит в том, что в XHTML применяется синтаксис XML, который предназначен для помощи в разработке синтаксически корректных и правильных документов XML. XHTML представляет собой словарь XML, в то время как HTML — это лишь предшествующий XHTML язык разметки.
В связи с тем, что XHTML является приложением XML, некоторые действия. которые совершенно правильны в HTML4 на базе SGML, должны быть изменены. Перечислим правила, которые необходимо соблюдать при переходе от HTML к XHTML:
1. Правильная вложенность тегов.Это означает, что все элементы обязаны иметь закрывающий тег(например, <p></p>
) или быть написаны в специальной форме(например, <br />
), а также должна соблюдаться корректная вложенность элементов.
Хотя перекрывание элементов не допускалось и в SGML, некоторые браузеры лояльно к этому относились и в большинстве случаев отображали именно то, что хотел показать автор документа.
ПРАВИЛЬНО: вложенные элементы
<p>
выделяем это <em>
слово</em>
.</p>
НЕПРАВИЛЬНО: элементы перекрываются
<p>
выделяем это <em>
слово.</p></em>
Документы XHTML должны использовать нижний регистр для всех имен элементов и атрибутов HTML. Это необходимо, поскольку XML чувствителен к регистру, например, <ul>
и <UL>
это различные теги.
Все значения атрибутов, даже цифровые должны быть заключены в двойные("") или одинарные('') кавычки.
ПРАВИЛЬНО: атрибут в кавычках
<td colspan="8">
НЕПРАВИЛЬНО: атрибут не в кавычках
<td colspan=8>
Если значение атрибута содержит амперсанд, он должен выражаться мнемоникой ("&
"). Например, если атрибут href
элемента <a>
ссылается на скрипт CGI, который принимает параметры, он (атрибут) должен быть выражен так:
http://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user
, а не так:
.
http://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user
Предопределенные значения атрибутов (например атрибут type
элемента input
) регистрозависимы и должны быть написаны в нижнем регистре. Однако, это не касается значений атрибутов определяемых авторами документов (например значения для атрибутов id
, name
или class
), которые также регистрозависимы, но допускают использование символов в верхнем регистре.
Следует учесть, что ведущие и ведомые пробелы в значениях атрибутов удаляются браузерами, а один или несколько последовательных пробелов между словами (а также переводы строк) преобразуются в одиночный межсловный пробел (символ пробела ASCII в западных языках).
XML не поддерживает минимизацию атрибутов. Пары атрибут/значение обязательно должны быть выписаны полностью. Имена атрибутов, такие как compact
и checked
, не могут появляться в элементах без определенных значений.
ПРАВИЛЬНО: атрибут написан полностью
<dl compact="compact">
НЕПРАВИЛЬНО: атрибут минимизирован
<dl compact>
В HTML4 на базе SGML, некоторые элементы допускали отсутствие конечного тега при наличии других последующих элементов с закрывающими тегами. Такое отсутствие конечных тегов не допускается в XHTML на базе XML. Все элементы, за исключением тех, которые объявлены в определении типа документа как EMPTY
, должны иметь конечный тег.
ПРАВИЛЬНО: закрытые элементы
<p>
Здесь какой-то текст.</p><p>
Еще параграф с текстом.</p>
НЕПРАВИЛЬНО: незакрытые элементы
<p>
Здесь какой-то текст.<p>
Еще параграф с текстом.
Пустые элементы обязаны иметь конечный тег, или стартовый тег обязан заканчиваться />
. Например, <br />
или <br></br>
.
Для совместимости с устаревшими браузерами следует писать пробел перед />
в одиночном пустом элементе.
Следует использовать минимизированный синтаксис для тегов пустых элементов, например, <br />
так как альтернативный синтаксис <br></br>
, допускаемый XML, дает непредсказуемые результаты во многих существующих браузерах.
При создании пустого объекта элемента, чья модель содержимого не EMPTY
(например, пустой заголовок или параграф), не следует использовать минимизированную форму(т.е. нужно использовать <p> </p>
, а не <p />
).
ПРАВИЛЬНО: пустые теги закрыты
<br /><hr />
НЕПРАВИЛЬНО: пустые теги не закрыты
<br><hr>
<script>
и <style>
.
В XHTML элементы <script>
и <style>
объявлены как имеющие содержимое #PCDATA
. Как результат этого, <
и &
будут рассматриваться как начало разметки, а мнемоники, такие как <
и &
, будут считаться процессором XML мнемониками символов <
и &
соответственно. Перенос содержимого элементов <script>
или <style>
в раздел, помеченный CDATA
, позволит избежать расшифровки этих мнемоник.
<script type="text/javascript">//<![CDATA[
... unescaped script content ...
//]]></script>
Разделы CDATA
распознаются процессором XML и являются узлами в объектной модели документа(Document Object Model)
Альтернативой может быть использование внешних документов скриптов и стилей.
7. Исключения SGML.SGML предоставлял создателям определений типа документа возможность исключать некоторые элементы как содержимое элемента. Такие запрещения (называемые "исключения") невозможны в XML.
Например, Строгое определение типа документа HTML4(Strict DTD) запрещает вложение элемента <a>
в другой элемент <a>
на любую глубину. Хотя эти запрещения и могут отсутствовать в определении типа документа, определенные элементы не могут вкладываться.
В XHTML:
<a>
не может содержать другие элементы <a>
.
<pre>
не может содержать элементы <img>
, <object>
, <big>
, <small>
, <sub>
или <sup>
.
<button>
не может содержать элементы <input>
, <select>
, <textarea>
, <label>
, <button>
, <form>
, <fieldset>
, <iframe>
или <isindex>
.
<label>
не может содержать другие элементы <label>
.
<form>
не может содержать другие элементы <form>
.
HTML 4 определил атрибут name
для элементов a
, applet
, form
, frame
, iframe
, img
и map
, а также ввёл атрибут id
. Оба эти атрибута созданы для использования в качестве идентификаторов фрагмента.
В XML идентификаторы фрагмента имеют тип ID
, и в элементе может быть только один атрибут типа ID
. Таким образом, в XHTML 1.0 атрибут id
определён как атрибут типа ID
. Чтобы быть уверенным, что документы XHTML 1.0 являются правильно структурированными документами XML, документы XHTML 1.0 обязаны использовать атрибут id
для определения идентификаторов фрагмента, и даже в тех элементах, которые исторически имели атрибут name
.
Также следует помнить, что значение атрибута id
в пределах документа должно быть уникальным.
В XHTML 1.1 для элементов a
и map
атрибут name
удален, вместо него следует использовать атрибут id
.
В комментариях двойные тире "--" могут обозначать только начало и конец комментария.
НЕПРАВИЛЬНО:
<!-- использовать разделитель, написанный ниже -- нельзя и этот комментарий -- неверен -->
<!--------------------------------->
ПРАВИЛЬНО:
<!-- использовать разделитель, написанный ниже - - можно и этот комментарий - - верен -->
<!--==== - - - - ====-->
Таким образом, двойные тире "--" не обозначающие начало и конец комментария в его тексте должны быть чем-либо заменены или разделены пробелом, например "- -".
10. Символы < и & в тексте документаСимволы < и & в тексте документа должны быть заменены соответствующими последовательностями < и &.
Нет необходимости, но желательно заменять также и > на >.
11. Вот образец минимального документа XHTML:<?xml version="1.0" encoding="windows-1251"?>
XHTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
<title></title>
Подробности о разметке на сайте W3C:
</head>
<body>
<p><a href="http://w3c.org/MarkUp/">
http://w3c.org/MarkUp/ </a>.</p>
</body>
</html>
Корневым элементом документа должен (обязан) быть <html>
.
Корневой элемент документа обязан обозначить пространство имён XHTML путём использования атрибута xmlns
[XMLNAMES]. Пространство имён XHTML определено в http://www.w3.org/1999/xhtml.
В документе обязано присутствовать объявление DOCTYPE
, предшествующее корневому элементу(<html>
).
Публичный идентификатор, включённый в объявление DOCTYPE
, обязан быть ссылкой на одно из определений типа документа. O различных определениях DOCTYPE
и их влиянии на отображение (X)HTML документа в браузерах можно прочитать в статье "Различное отображение HTML документов в браузере зависит от объявленного Doctype".
- Все элементы должны быть закрыты. Теги, которые не имеют закрывающего тега (например, <img> или <br>) должны иметь на конце / (например, <br />).
- Булевы атрибуты записываются в развёрнутой форме. Например, следует писать <option selected="selected"> или <td nowrap="nowrap">.
- Имена тегов и атрибутов должны быть записаны строчными буквами (например, <img alt="" /> вместо <IMG ALT="" />).
- XHTML гораздо строже относится к ошибкам в коде; < и & везде, даже в URL, должны замещаться < и & соответственно. По рекомендации W3C браузеры, встретив ошибку в XHTML, должны сообщить о ней и не обрабатывать документ. Для HTML браузеры должны были попытаться понять, что хотел сказать автор.
- Кодировкой по умолчанию является UTF-8 (в отличие от HTML, где кодировкой по умолчанию является ISO 8859-1).
Для XHTML страниц рекомендуется задавать MIME-тип — application/xhtml+xml, но это не является обязательным, более того — браузер Internet Explorer 8 и младшие версии, не смогут обрабатывать страницу, поэтому с XHTML 1.0 традиционно используется MIME-тип для HTML — text/html.
Также стандарт рекомендует указание <?xml version="1.0" encoding="utf-8"?> перед DTD, но это не обязательно, более того — браузер Internet Explorer воспринимает такое указание (как и любой другой текст перед <!DOCTYPE>), как признак того, что данную страницу необходимо отображать в режиме обратной совместимости, а не согласно стандарту. Существует три типа документов XHTML: strict, transitional и frameset. Наиболее употребительной и универсальной из версий XHTML является переходная (англ. transitional), поскольку она позволяет использовать iframe (включение содержимого одной веб-страницы в другую) и атрибут target у ссылок (для указания того, например, что ссылке необходимо открываться в новом окне). Фреймовая версия (англ. frameset) представляет собой расширенный вариант transitional, добавляя к нему, как следует из названия, возможность установки frameset вместо body. DTD строгой версии XHTML (англ. strict) не содержит многих тегов и атрибутов, описанных в DTD transitional, и признанных устаревшими.
Валидный документ должен содержать определение типа документа (DTD). DTD должен быть расположен до всех других элементов документа. Вот наиболее распространённые типы DTD для XHTML:
XHTML 1.0 Strict
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
XHTML 1.0 Transitional
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
XHTML 1.0 Frameset
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
XHTML 1.0 Mobile
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
XHTML 1.1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
Самыми распространёнными ошибками в XHTML-разметке являются:
- Незакрытые элементы (XHTML, в отличие от HTML, требует закрытия всех элементов, в том числе не имеющих закрывающего тега, как, например, <br />).
- Отсутствие альтернативных текстов для изображений (достигающийся применением атрибута alt, который помогает сделать документы доступнее для устройств, которые не в состоянии отображать изображения, или предназначенных для слабовидящих людей).
- Присутствие текста непосредственно в теге <body> документа (должен быть объявлен блочный элемент, внутрь которого следует помещать содержимое).
- Вложение блочных элементов внутрь инлайновых (внутристрочных) (например, блочные элементы <div> или <p> не могут быть вложены внутрь инлайновых элементов <a>, <span>, <em> и так далее).
- Пренебрежение заключением значений атрибутов в кавычки (<a href=http://example.com/> вместо <a href="http://example.com/">).
- Неправильное вложение элементов (конструкции вида <strong> <em> </strong> </em>).
- Неправильное использование ссылок-мнемоник (например, & вместо &)
- Написание тегов и/или атрибутов прописными буквами (<DIV STYLE="…"> вместо <div style="...">).
- Задание в теге <!DOCTYPE …> относительного пути к DTD-файлу, скопированного с сайта www.w3.org ("DTD/xhtml11.dtd" вместо "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd").
- Весь DOCTYPE написан в нижнем регистре
XHTML1.0, элементы по DTD
DOCTYPE | |||
---|---|---|---|
Элемент | Strict | Transitional | Frameset |
<!-- --> | да | да | да |
<!DOCTYPE> | да | да | да |
<a> | да | да | да |
<abbr> | да | да | да |
<acronym> | да | да | да |
<address> | да | да | да |
<applet> | нет | да | да |
<area /> | да | да | да |
<b> | да | да | да |
<base /> | да | да | да |
<basefont> | нет | да | да |
<bdo> | да | да | да |
<big> | да | да | да |
<blockquote> | да | да | да |
<body> | да | да | нет |
<br /> | да | да | да |
<button> | да | да | да |
<caption> | да | да | да |
<center> | нет | да | да |
<cite> | да | да | да |
<code> | да | да | да |
<col> | да | да | да |
<colgroup> | да | да | да |
<dd> | да | да | да |
<del> | да | да | да |
<dfn> | да | да | да |
<dir> | нет | да | да |
<div> | да | да | да |
<dl> | да | да | да |
<dt> | да | да | да |
<em> | да | да | да |
<fieldset> | да | да | да |
<font> | нет | да | да |
<form> | да | да | да |
<frame> | нет | нет | да |
<frameset> | нет | нет | да |
<h1> ... <h6> | да | да | да |
<head> | да | да | да |
<hr /> | да | да | да |
<html> | да | да | да |
<i> | да | да | да |
<iframe> | нет | да | да |
<img /> | да | да | да |
<input> | да | да | да |
<ins> | да | да | да |
<kbd> | да | да | да |
<label> | да | да | да |
<legend> | да | да | да |
<li> | да | да | да |
<link> | да | да | да |
<map> | да | да | да |
<menu> | нет | да | да |
<meta> | да | да | да |
<noframes> | нет | нет | да |
<noscript> | да | да | да |
<object> | да | да | да |
<ol> | да | да | да |
<optgroup> | да | да | да |
<option> | да | да | да |
<p> | да | да | да |
<param> | да | да | да |
<pre> | да | да | да |
<q> | да | да | да |
<s> | нет | да | да |
<samp> | да | да | да |
<script> | да | да | да |
<select> | да | да | да |
<small> | да | да | да |
<span> | да | да | да |
<strike> | нет | да | да |
<strong> | да | да | да |
<style> | да | да | да |
<sub> | да | да | да |
<sup> | да | да | да |
<table> | да | да | да |
<tbody> | да | да | да |
<td> | да | да | да |
<textarea> | да | да | да |
<tfoot> | да | да | да |
<th> | да | да | да |
<thead> | да | да | да |
<title> | да | да | да |
<tr> | да | да | да |
<tt> | да | да | да |
<u> | нет | да | да |
<ul> | да | да | да |
<var> | да | да | да |
XHTML1.0, атрибуты элементов по DTD
DOCTYPE | ||||
---|---|---|---|---|
Атрибут | Элемент | Strict | Transitional | Frameset |
abbr | td th | да | да | да |
acronym | td th | да | да | да |
accept-charset | form | да | да | да |
accept | form input | да | да | да |
accesskey | a area button input label legend textarea | да | да | да |
action | form | да | да | да |
align | applets | — | да | да |
align | iframe | — | — | да |
align | caption div h1-h6 hr img input legend p table | нет | да | да |
align | col colgroup tbody td tfoot th thead tr | да | да | да |
alink | body | нет | да | да |
alt | applet | — | да | да |
alt | area img input | да | да | да |
archive | applet | — | да | да |
archive | object | да | да | да |
axis | td th | да | да | да |
background | body | нет | да | да |
bgcolor | table tr td th body | нет | да | да |
border | img | нет | да | да |
border | table | да | да | да |
cellpadding | table | да | да | да |
cellspacing | table | да | да | да |
char | col colgroup tbody td tfoot th thead tr | да | да | да |
charoff | col colgroup tbody td tfoot th thead tr | да | да | да |
charset | a link script | да | да | да |
checked | input | да | да | да |
cite | blockquote q del ins | да | да | да |
class | все элементы, кроме: base basefont head html meta param script style title | да | да | да |
classid | object | да | да | да |
code | applet | — | да | да |
codebase | applet | — | да | да |
codebase | object | да | да | да |
codetype | object | да | да | да |
color | basefont font | — | да | да |
cols | frameset | — | — | да |
cols | textarea | да | да | да |
colspan | td th | да | да | да |
compact | dir dl menu ol ul | — | да | да |
content | meta | да | да | да |
coords | a area | да | да | да |
data | object | да | да | да |
datetime | del ins | да | да | да |
declare | object | да | да | да |
defer | script | да | да | да |
dir | apple basefont | — | да | да |
dir | frame frameset iframe | — | — | да |
dir | все элементы, кроме: base br param script | да | да | да |
disabled | button input optgroup option select textarea | да | да | да |
enctype | form | да | да | да |
face | basefont font | — | да | да |
for | label | да | да | да |
frame | table | да | да | да |
frameborder | frame iframe | — | — | да |
headers | td th | да | да | да |
height | applet | — | да | да |
height | iframe | — | — | да |
height | td th | нет | да | да |
height | img | да | да | да |
href | a area link base | да | да | да |
hreflang | a link | да | да | да |
hspace | applet | — | да | да |
hspace | img | нет | да | да |
http-equiv | meta | да | да | да |
id | все элементы, кроме: base head html meta script style title | да | да | да |
ismap | input | нет | да | да |
ismap | img | да | да | да |
label | option optgroup | да | да | да |
lang | applet basefont | — | да | да |
lang | frame frameset iframe | — | — | да |
lang | все элементы, кроме: base br param script | да | да | да |
link | body | нет | да | да |
longdesc | frame iframe | — | — | да |
longdesc | img | да | да | да |
marginheight | frame iframe | — | — | да |
marginwidth | frame iframe | — | — | да |
maxlength | input | да | да | да |
media | link style | да | да | да |
method | form | да | да | да |
multiple | select | да | да | да |
name | applet | — | да | да |
name | frame iframe | — | — | да |
name | a button input map meta param select textarea | да | да | да |
nohref | area | да | да | да |
noresize | frame | — | — | да |
noshade | hr | нет | да | да |
nowrap | td th | нет | да | да |
object | applet | — | да | да |
onblur | a area button input label select textarea | да | да | да |
onchange | input select textarea | да | да | да |
onclick | applet basefont font | — | да | да |
onclick | frame frameset iframe | — | — | да |
onclick | все элементы, кроме: base bdo br head html meta param script style title | да | да | да |
ondblclick | applet basefont font | — | да | да |
ondblclick | frame frameset iframe | — | — | да |
ondblclick | все элементы, кроме: base bdo br head html meta param script style title | да | да | да |
onfocus | a area button input label select textarea | да | да | да |
onkeydown | applet basefont font | — | да | да |
onkeydown | frame frameset iframe | — | — | да |
onkeydown | все элементы, кроме: base bdo br head html meta param script style title | да | да | да |
onkeypress | applet basefont font | — | да | да |
onkeypress | frame frameset iframe | — | — | да |
onkeypress | все элементы, кроме: base bdo br head html meta param script style title | да | да | да |
onkeyup | applet basefont font | — | да | да |
onkeyup | frame frameset iframe | — | — | да |
onkeyup | все элементы, кроме: base bdo br head html meta param script style title | да | да | да |
onload | frameset | — | — | да |
onload | body | да | да | да |
onmousedown | applet basefont font | — | да | да |
onmousedown | frame frameset iframe | — | — | да |
onmousedown | все элементы, кроме: base bdo br head html meta param script style title | да | да | да |
onmousemove | applet basefont font | — | да | да |
onmouseout | frame frameset iframe | — | — | да |
onmouseout | все элементы, кроме: base bdo br head html meta param script style title | да | да | да |
onmouseover | applet basefont font | — | да | да |
onmouseover | frame frameset iframe | — | — | да |
onmouseover | все элементы, кроме: base bdo br head html meta param script style title | да | да | да |
onmouseup | applet basefont font | — | да | да |
onmouseup | frame frameset iframe | — | — | да |
onmouseup | все элементы, кроме: base bdo br head html meta param script style title | да | да | да |
onreset | form | да | да | да |
onselect | input textarea | да | да | да |
onsubmit | form | да | да | да |
onunload | frameset | — | — | да |
onunload | body | да | да | да |
profile | head | да | да | да |
readonly | input textarea | да | да | да |
rel | a link | да | да | да |
rev | a link | да | да | да |
rows | frameset | — | — | да |
rows | textarea | да | да | да |
rowspan | td th | да | да | да |
rules | table | да | да | да |
scheme | meta | да | да | да |
scope | td th | да | да | да |
scrolling | frame iframe | — | — | да |
selected | option | да | да | да |
shape | a area | да | да | да |
size | basefont font | — | да | да |
size | hr | нет | да | да |
size | input select | да | да | да |
span | col colgroup | да | да | да |
src | frame iframe | — | — | да |
src | img input script | да | да | да |
standby | object | да | да | да |
start | ol | нет | да | да |
style | basefont | — | да | да |
style | все элементы, кроме: base head html meta param script style title | да | да | да |
summary | table | да | да | да |
tabindex | a area button input select textarea | да | да | да |
target | a base link area form | нет | да | да |
text | body | нет | да | да |
title | basefont | — | да | да |
title | все элементы, кроме: base head html meta param script title | да | да | да |
type | ol ul | нет | да | да |
type | a button form input link object param script style | да | да | да |
usemap | img input | да | да | да |
valign | col colgroup tbody td tfoot th thead tr | да | да | да |
value | button input option param | да | да | да |
valuetype | param | да | да | да |
version | html | нет | да | да |
vlink | body | нет | да | да |
vspace | applet | — | да | да |
vspace | img | нет | да | да |
width | applet | — | да | да |
width | iframe | — | — | да |
width | hr td th | нет | да | да |
width | col colgroup img table | да | да | да |