XHTML

XHTML (ang. Extensible HyperText Markup Language, rozszerzalny hipertekstowy język znaczników) jest językiem skłądającym się ze znaczników (ang. tags) służący do tworzenia stron WWW. XHTML to młodszy brat HTML-a, który w odróżnieniu od niego jest zgodny ze specyfikacją XML. Specyfikacje XHTML przygotowuje organizacja W3C.

XHTML/1.0 nie jest następcą HTML, a jedynie przedstawieniem HTML 4.01 w postaci XML. XHTML/2.0 miał być następcą HTML, niekompatybilnym wstecz, ale ze względu na niekompatybilność Internet Explorera, a co za tym idzie niechęć użytkowników, W3C zadecydowało o kontynuowaniu linii XHTML/1.0 i HTML 4 jako XHTML 1.1 i HTML 5.

W odróżnieniu od HTML-a (który jest zastosowaniem SGML), dokumenty pisane w XHTML są zgodne z oficjalną specyfikacją XML (to znaczy, że dokumenty w XHTML są poprawnymi dokumentami XML) i dzięki temu można je łatwo generować z innych dokumentów XML przy pomocy np. transformacji XSLT, a także automatycznie przekształcać w inne formy XML-a. Dzięki temu dokumenty te posiadają większe możliwości, jak choćby wstawianie innych dokumentów za pomocą jednej metody (element <object/>), zagnieżdżanie wzorów matematycznych (język MathML), czy grafik wektorowych (język SVG).

Jedną z największych zalet XHTML jest możliwość łączenia z innymi językami zgodnymi z XML, np. wspomniany już MathML czy SVG. Odbywa się to dzięki wykorzystaniu mechanizmu przestrzeni nazw XML.

Obecnie nowe przeglądarki, takie jak Firefox czy Opera, praktycznie w pełni obsługują XHTML, lecz program mający największy udział w rynku – Internet Explorer – obsługuje XHTML-owy typ zawartości dopiero od wersji 9. W praktyce zmuszało to webmasterów do stosowania dla dokumentów XHTML starego HTML-owego typu zawartości – dzięki temu, że XHTML w wersji 1.0 „symuluje” HTML 4 (tzn. posiada praktycznie taki sam zestaw elementów i atrybutów), wyświetlanie XHTML jako HTML nie sprawia większych problemów w żadnej przeglądarce, o ile dokument nie wykorzystuje dodatkowych możliwości XHTML, których nie ma w HTML (przedrostków nazw elementów, innych przestrzeni nazw, XML DOM), zachowanie to uznawane jest za nieprawidłowe, choć dopuszczalne, ze względu na niezgodność wcześniejszych wersji Internet Explorera.

Jednak aby prawidłowo wyświetlać strony zarówno w nowoczesnych, jak i starszych przeglądarkach należy wykorzystać metodę negocjowania zawartości.

Negocjacja zawartości

Internet Explorer nie potrafi odczytać stron XHTML podanych jako application/xhtml+xml ― w domyślnej konfiguracji będzie wyświetlał okno dialogowe z prośbą o pobranie takiego pliku. Ogranicza to w znacznym stopniu możliwość korzystania z typu XHTML w sieci WWW.

Problem ten można obejść przez wysyłanie informacji o typie zawartości ustawionej na application/xhtml+xml przeglądarkom go obsługującym, natomiast pozostałym przesyłanie dokumentu z typem text/html. Można to osiągnąć stosując metodę negocjowania zawartości (content negotiation) po stronie serwera. Można wykorzystać do tego język skryptowy, np. PHP:

$xhtml = stristr("application/xhtml+xml",strtolower($_SERVER
["HTTP_ACCEPT"]) || stristr("W3C_Validator",$_SERVER["HTTP_USER_AGENT"]) 
|| stristr("WebKit",$_SERVER["HTTP_USER_AGENT"]);
header('Content-Type: '.($xhtml)?'application/xhtml+x':'text/ht'.'ml; 
charset=utf-8');
# ew. utf-8 lub inne kodowanie

Obejścia dla walidatora W3C i Chrome i Safari (WebKit) są konieczne, gdyż obsługują one XHTML, ale wysyłają w nagłówku Accept ciąg */* lub nie wysyłają go wcale, jak Walidator.

Podstawowe reguły XHTML

Zasady konstruowania dokumentów XHTML – najważniejsze różnice w porównaniu z HTML:

www: Jeśli strona XHTML zawiera błędy, nie może zostać wyświetlona;
www: Strony XHTML muszą mieć typ zawartości application/xhtml+xml (lub inny XML);
www: Dzięki użyciu XHTML można stosować inne aplikacje XML (jak MathML czy SVG) bezpośrednio w dokumencie, czego nie da się w HTML;
www: Dokument powinien rozpoczynać się od deklaracji XML (np. <?xml version="1.0" encoding="utf-8"?>); nie jest ona wymagana, gdy dokument ma kodowanie znaków UTF-8 lub UTF-16, albo gdy odpowiednie kodowanie zostało określone w nagłówkach HTTP (jednak nawet wtedy warto dołączać deklarację XML, gdyż pozwala ona ustalić kodowanie np. w przypadku zapisania strony na dysku);
www: Element główny (html) musi zawierać atrybut xmlns określający przestrzeń nazw XHTML: http://www.w3.org/1999/xhtml;
www: Znacznikowi otwierającemu każdego niepustego elementu powinien odpowiadać znacznik zamykający (np. <li> ... </li>);
www: Puste elementy muszą także być zamykane (np. zamiast <br> musi być <br/>, albo <br></br>);
www: Elementy muszą być zagnieżdżane w odpowiedni sposób (np. zamiast <p>Tekst z <em>wyróżnieniem</p></em><p>Tekst z <em>wyróżnieniem</em></p>); wprawdzie w HTML także istniał taki wymóg, lecz nie był egzekwowany przez przeglądarki;
www: Nazwy elementów i atrybutów XHTML muszą być pisane małymi literami;
www: Wszystkie wartości atrybutów muszą być ujęte w cudzysłów (podwójny, np. <td rowspan="3">, albo apostrof, np. <td rowspan='3'>);
www: Niedozwolona jest minimalizacja atrybutów (np. zamiast <textarea readonly> musi być <textarea readonly="readonly">);
www: Wewnątrz elementów script i style komentarze XML (<!-- -->) zamiast ukrywać je przed starszymi przeglądarkami (które i tak nie obsługują XHTML), powodują ignorowanie tych stylów lub skryptów. W sekcji CDATA natomiast komentarze są traktowane jako element stylu/skryptu;
www: Jeśli zawarte wewnątrz dokumentu arkusze stylów lub skrypty zawierają znaki & lub <, zawartość elementów style i script należy umieścić w sekcji CDATA (np.: <style type="text/css"><![CDATA[ arkusz stylów]] ></style>); alternatywnie można użyć encji lub zewnętrznego arkusza stylów/skryptu;
www: Ze względu na trudności z parsowaniem, nie powinno się używać w XHTML-u javascriptowej metody document.write() i właściwości innerHTML; jednak niektóre przeglądarki już obsługują te konstrukcje także w dokumentach XML. Zamiast nich należy używać metod DOM.

XHTML a PHP

Używając języka PHP w dokumentach XHTML często można się spotkać z błędem podczas parsowania instrukcji przetwarzania lub deklaracji XML (konstrukcje typu <?xml version="1.0" encoding="utf-8"?>). Przyczyną jest włączona opcja używania krótkich znaczników (<? ?>) do oznaczania bloku PHP, co powoduje, że deklaracje XML są traktowane przez parser jak kod PHP.

Wyłączenie krótkich znaczników PHP można osiągnąć dokonując następującego wpisu do pliku php.ini:

short_open_tag = Off

Ten sam efekt można osiągnąć przez umieszczenie w pliku .htaccess (serwer Apache) wpisu:

php_flag short_open_tag Off

Jeśli nie mamy możliwości lub nie chcemy wyłączać krótkich znaczników, akceptowalnym obejściem problemu jest używanie PHP-owej konstrukcji echo lub print do wypisywania deklaracji XML:

<?php echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" ?>

Przykłady dokumentów XHTML

XHTML 1.1
Content-Type: application/xhtml+xml; charset="utf-8"
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="style.css"?>
<!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="pl">
<head>
  <title>Przykład dokumentu zgodnego z XHTML 1.1</title>
</head>
<body>
  <div>To jest przykład.</div>
</body>
</html>
XHTML 1.0 Strict kompatybilny z HTML Nie powinien być stosowany, używany tylko ze względu na niekompatybilność Internet Explorera z XHTML.
Content-Type: text/html; charset="utf-8"
<!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" xml:lang="pl" lang="pl">
<head>
  <title>Przykład dokumentu zgodnego z XHTML 1.0 Strict</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
  <p>To jest przykład.</p>
</body>
</html>
HTML 5
Content-Type: application/xhtml+xml; charset=utf-8
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="style.css" type="text/css" ?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl">
<head>
   <title>Przykład dokumentu zgodnego z XHTML 5</title>
</head>
<body>
   <div>To jest przykład.</div>
</body>
</html>
Top