| World Wide Web |
Struktura stron WWW
HTML, XHTML, XML, XSL
Generowanie dynamicznych stron WWW
Active Server Pages, ASP.NET, JavaServer Pages, PHP
Po stronie użytkownika
kaskadowe arkusze stylów, JavaScript, AJAX, kolory w Internecie
Przesyłanie danych
Hypertext Transfer Protocol, HTTPS, HTTP referrer, serwer WWW, VoiceXML, XMLHttpRequest
Pojęcia
architektura informacji, użyteczność, dostępność
|
XHTML (ang. Extensible HyperText Markup Language, rozszerzalny język znaczników hipertekstowych) – język służący do tworzenia stron WWW ogólnego przeznaczenia. Specyfikacje XHTML przygotowuje organizacja W3C.
XHTML/1.0 nie jest następcą HTML, a zaledwie 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 oraz HTML 4 jako XHTML 1.1 oraz HTML 5.
W przeciwieństwie 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) oraz dzięki temu da się 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.
Aktualnie 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[1] – 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. ma praktycznie taki sam zestaw elementów oraz 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 oraz starszych przeglądarkach trzeba wykorzystać metodę negocjowania zawartości.
Podstawowe reguły XHTML
Zasady konstruowania dokumentów XHTML – najważniejsze różnice w porównaniu z HTML:
- Jeśli strona XHTML zawiera błędy, nie może zostać wyświetlona
- Strony XHTML muszą posiadać typ zawartości
application/xhtml+xml (lub odmienny XML)
- Dzięki użyciu XHTML da się stosować inne aplikacje XML (jak MathML czy SVG) bezpośrednio w dokumencie, czego nie da się w HTML
- Dokument powinien rozpoczynać się od deklaracji XML (np.
<?xml version="1.0" encoding="utf-8"?>); nie jest ona wymagana, kiedy dokument ma kodowanie znaków UTF-8 albo UTF-16, albo kiedy odpowiednie kodowanie było określone w nagłówkach HTTP (jednak nawet wtedy warto dołączać deklarację XML, albowiem dopuszcza ona ustalić kodowanie np. w przypadku zapisania strony na dysku)
- Element podstawowy (
html) musi zawierać atrybut xmlns określający przestrzeń nazw XHTML: nullwww.w3.org/1999/xhtml
- Znacznikowi otwierającemu każdego niepustego elementu powinien odpowiadać znacznik zamykający (np.
<li> ... </li>)
- Puste elementy muszą także być zamykane (np. zamiast
<br> musi być <br/>, albo <br></br>)
- 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
- Nazwy elementów oraz atrybutów XHTML muszą być pisane małymi literami
- Wszystkie wartości atrybutów muszą być ujęte w cudzysłów (podwójny, np.
<td rowspan="3">, albo apostrof, np. <td rowspan='3'>)
- Niedozwolona jest minimalizacja atrybutów (np. zamiast
<textarea readonly> musi być <textarea readonly="readonly">)
- Wewnątrz elementów
script oraz style komentarze XML (<!-- -->) zamiast ukrywać przed starszymi przeglądarkami (które oraz tak nie obsługują XHTML), powoduje ignorowanie stylów albo skryptów. W sekcji CDATA zaś komentarze są traktowane jako element stylów/skryptu
- Jeśli zawarte wewnątrz dokumentu arkusze stylów albo skrypty zawierają znaki
& albo <, zawartość elementów style oraz script trzeba umieścić w sekcji CDATA (np.: <style type="text/css"><![CDATA[ arkusz stylów]] ></style>); alternatywnie da się użyć encji albo zewnętrznego arkusza stylów/skryptu
- Z uwagi na trudności z parsowaniem, nie winno się używać w XHTML-u javascriptowej metody
document.write() oraz właściwości innerHTML; jednak pewne przeglądarki już obsługują te konstrukcje także w dokumentach XML. Zamiast nich trzeba używać metod DOM.
Kompatybilność z HTML
Gdyż nadal są używane nieobsługujące XHTML przeglądarki internetowe, jeżeli chcemy wysyłać dokument zarówno jako XHTML, jak oraz HTML (dla starszych przeglądarek), możemy się zastosować do kilku reguł. Jednak niektórzy uważają, że XHTML zgodny z HTML pozbawia całkowicie sensu ideę HTML-a jako XML (patrz: nullwww.hixie.ch/advocacy/xhtml).
- Znaczniki pustych elementów powinny zawierać dodatkową spację przed ukośnikiem, np. zamiast
<br/> winno być <br />
- Należy unikać używania zminimalizowanej formy (np.
<p/>) w przypadku pustych elementów, które potrafią posiadać zawartość; np. stosowanie znacznika <script type="text/javascript" src="skrypt.js"/> w dokumencie przesyłanym jako HTML prowadzi zwykle do niewyświetlenia reszty dokumentu; trzeba w tym wypadku używać <script type="..." src="..."></script>
- Obok albo zamiast instrukcji
xml-stylesheet trzeba odwoływać się do zewnętrznych arkuszy stylów przy pomocy obsługiwanego w HTML-u znacznika <link rel="stylesheet" ... />
- Objęcie wewnętrznych skryptów oraz stylów sekcją CDATA może powodować ich błędne działanie; trzeba w związku z tym zakomentować znaczniki początku oraz końca sekcji CDATA, np.:
<style type="text/css">/* <![CDATA[ */ arkusz stylów /*]] > */</style>
- nieoczekiwanie typowej dla XML deklaracji języka za pomocą atrybutu
xml:lang, trzeba też używać zgodnego z HTML atrybutu lang.
- Dla kompatybilności z IE6 trzeba pomijać deklarację XML — powoduje to w nim przejście w tryb wstecznej zgodności. Nie ma sensu jednak dodawać jej dla innych przeglądarek (skryptami po stronie serwera), albowiem oraz tak jest ona nieobowiązkowa. Strona musi być zakodowana jako UTF-8/USC-*, a jeżeli jest zakodowana inaczej, musimy odpowiednią informację dodać do nagłówka Content-Type (np. kodem PHP:
header("Content-Type: $mime; charset=\"iso-8859-2\"");, gdzie $mime to ustalony w wyniku negocjacji zawartości typ pliku).
- W DOM trzeba używać
createElementNS zamiast createElement oraz trzeba uważać na wielkość liter (DOM HTML podaje nazwy elementów wielkimi literami, DOM XML zachowuje wielkość liter oraz w XHTML dopuszcza tylko małe litery).
XHTML a PHP
Używając języka PHP w dokumentach XHTML wielokrotnie da się się spotkać z błędem podczas parsowania instrukcji przetwarzania albo 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 da się osiągnąć dokonując następującego wpisu do pliku php.ini:
short_open_tag = Off
Ten sam efekt da się osiągnąć przez umieszczenie w pliku .htaccess (serwer Apache) wpisu:
php_flag short_open_tag Off
Jeśli nie mamy możliwości albo nie chcemy wyłączać krótkich znaczników, akceptowalnym obejściem dylematu jest używanie PHP-owej konstrukcji echo albo print do wypisywania deklaracji XML:
<?php echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" ?>
Walidacja XHTML
Tak jak każdy dokument XML, dokument XHTML powinien spełniać dwa rodzaje poprawności:
- poprawność składniowa (well-formedness) – zgodność z podstawowymi regułami XML; da się ją sprawdzić wysyłając dokument z typem treści ustawionym na application/xhtml+xml oraz otwierając w obsługującej XHTML przeglądarce, w przypadku błędu ma ona obowiązek nie wyświetlić dokumentu, albo w walidatorze
- poprawność strukturalna (validity) – zgodność z regułami określonymi w skojarzonym z danym typem dokumentu schemacie; sprawdzanie tej poprawności to właśnie walidacja, dokonuje się jej przy pomocy walidatorów; walidator wychwytuje także błędy w kodowaniu znaków.
Schematy określające definicję typu dokumentu w przypadku XHTML są zwykle wyrażone w DTD. Aby walidator wiedział wobec jakiej wersji oraz odmiany języka ma sprawdzać poprawność, konieczne jest umieszczenie w dokumencie deklaracji typu dokumentu (DOCTYPE). Deklaracja ta powinna być umieszczona po deklaracji XML (jeśli jest obecna); obie te deklaracje składają się na razem prolog XML. W XHTML 1.0 są 3 zróżnicowane DTD, każda z nich definiuje osobną odmianę tej wersji języka. W XHTML 1.1 jest już tylko jedna DTD, ale dzięki modularyzacji XHTML da się łatwo na jej bazie tworzyć własne DTD.
DTD (i bazujący na nim walidator W3C) ma jednak sporo ograniczeń oraz nie potrafi wyrazić wszystkich reguł języka XHTML. Możliwe więc, że dokument, który pozytywnie przeszedł walidację względem DTD wcale nie jest poprawny. Wielu ograniczeń DTD pozbawiony jest odmienny język schematów – XML Schema. W3C opublikowało specjalną notę zawierającą definicję XHTML 1.0 w XML Schema, przygotowywane jest też drugie wydanie XHTML 1.1, uzupełniające specyfikację o schematy w tym języku. XML Schema w porównaniu z DTD potrafi np. sprawdzić poprawność wartości atrybutu accesskey (powinien to być jeden znak, DTD dopuszcza na wiele znaków), czy atrybutu tabindex (powinna się zawierać pomiędzy 0 a 32767, walidator DTD przyjmie dowolny ciąg znaków). Chcąc walidować dokument względem XML Schema można, choć nie jest to konieczne, do elementu głównego (html) dodać atrybut schemaLocation z przestrzeni nazw nullwww.w3.org/2001/XMLSchema-instance, określający lokalizację schematu.
Innym językiem schematów mogącym służyć do walidacji XHTML jest RELAX NG. W porównaniu do XML Schema ma on bardziej intuicyjną składnię, lecz analogicznie oferuje dużo więcej możliwości niż DTD (choć na tym polu nieco ustępuje językowi XML Schema). RELAX NG ma być kolejnym, obok DTD oraz XML Schema, językiem, w którym zostanie zdefiniowany schemat XHTML 2.0 (jednak odwoływanie się w dokumencie do tego schematu nie będzie potrzebne, w przeciwieństwie do dwóch pozostałych języków).
Wersje XHTML
XHTML 1.0
XHTML 1.0 stał się zatwierdzony jako rekomendacja W3C 26 stycznia 2000 roku. Rekomendacja ta jest po prostu odpowiednim przeformułowaniem języka HTML 4 – SGML jako język definiowania stał się zastąpiony przez XML. XHTML 1.0 dysponuje więc praktycznie tym samym zestawem elementów oraz atrybutów, co HTML 4; analogiczny jest też podział na 3 wersje DTD:
- XHTML 1.0 Strict – odmiana ścisła, zalecana przez W3C, przeznaczona do tworzenia dokumentów z oddzieloną warstwą semantyki od prezentacji; nie zawiera prawie żadnych elementów prezentacyjnych
- XHTML 1.0 Transitional – odmiana przejściowa, obok elementów odmiany ścisłej zawiera wiele elementów prezentacyjnych
- XHTML 1.0 Frameset – zawiera wszystkie elementy wersji przejściowej, a dodatkowo także elementy przeznaczone do wyświetlania ramek.
Warto pamiętać, że DTD XHTML 1.0 nie jest w pełni analogiczne do DTD HTML 4.01 (bardziej jest podobne DTD HTML 4.0). Z uwagi na z tym pewne atrybuty dozwolone w HTML 4.01 Strict są niedozwolone w XHTML 1.0 Strict (ale da się je stosować w odmianach Transitional oraz Frameset). Dla przykładu w odmianie ścisłej XHTML 1.0 nie da się używać atrybutu name dla elementu form (mimo że jest to możliwe w HTML 4.01 Strict).
XHTML 1.1
Najnowszą rekomendacją XHTML jest opublikowana 31 maja 2001 r. oraz uaktualniona jako wydanie drugie 23 listopada 2010[2] specyfikacja XHTML 1.1. W3C zaleca jej używanie do wszystkich nowo powstających stron WWW, jednak ze względu na niemożliwość obsłużenia typu application/xhtml+xml w Internet Explorerze w wersji wcześniejszej niż 9, standard ten nie jest jak dotąd powszechnie stosowany.
XHTML 1.1 stał się opracowany zgodnie z regułami modularyzacji XHTML. Zawiera elementy oraz atrybuty takie, jak XHTML 1.0 Strict, usunięto tylko atrybut name dla elementu a oraz atrybut lang. Natomiast nowością w tej wersji XHTML są elementy oraz atrybuty służące do wyświetlania znaków ruby, używanych w typografii języków Dalekiego Wschodu.
XHTML 2.0 (zarzucony projekt)
Specyfikacja XHTML 2.0 miała przeistoczenie wiele znaczących zmian do języka bez względu na kompatybilność z poprzednimi wersjami XHTML, jednak z czasem zdecydowano o pozostawieniu w XHTML 2.0 takich elementów, jak img, czy h1—h6, aż wreszcie XHTML 2 stał się porzucony na rzecz HTML 5, który zachowuje większą kompatybilność wstecz.
Siódma wersja szkicu roboczego XHTML 2 była opublikowana 27 maja 2005 r. Najważniejsze zmiany wprowadzone w projekcie specyfikacji:
- prawie każdy element będzie mógł stanowić hiperłącze, np. będzie da się pisać:
<li href="index.xhtml">Strona główna</li>; element a zostanie jednak zachowany,
- element obrazka
img zostanie uznany za przestarzały na rzecz elementu object, ale atrybut src będzie da się stosować dla prawie każdego elementu, a zawartość tego elementu będzie wyświetlana tylko przy braku możliwości renderowania obrazka (lub innego medium, np. dźwięku): <p src="logo" type="image/png; image/gif;q=0.2">Tekst zamiast obrazka.</p>,
- stare, odziedziczone po HTML-u formularze zostaną zastąpione przez XForms, które zapewniają większą elastyczność oraz ograniczają konieczność stosowania skryptów,
- ograniczony zbiór atrybutów obsługujących zdarzenia zostanie zastąpiony przez XML Events – możliwe będzie odwoływanie się do zdarzeń DOM 2, a nawet definiowanie własnych zdarzeń; równocześnie obsługujący zdarzenia element
script zostanie przemianowany na handler,
- elementy nagłówków
h1 – h6 zostaną uznane za przestarzałe oraz zastąpione przez jeden element h, zaś stopień nagłówka będzie da się ustalać przez ich odpowiednie zagnieżdżenie w elementach section oznaczających rozdziały dokumentu,
- pozioma linia
hr zostanie zastąpiona przez element separator, który nie będzie musiał posiadać ani kształtu linii, ani układu poziomego (w XHTML < 2.0 da się to było zrobić przez kaskadowe arkusze stylów),
- pusty element końca linii
br, do którego nie da się było się odwoływać w arkuszach stylów, zostanie zastąpiony przez element l obejmujący pojedynczy wiersz,
- element
p oznaczający akapit będzie mógł oprócz tekstu zawierać także m.in. wykazy oraz tabele,
- usunięte będą ostatnie elementy prezentacyjne dozwolone w XHTML 1.1, takie jak
b, czy i; jako wyjątek pozostawione zostaną elementy indeksu górnego oraz dolnego: sup oraz sub,
- inne nowe elementy:
nl – lista nawigacyjna,
di – skojarzanie terminu oraz definicji w liście definicyjnej,
quote – cytat, zastąpi element q,
blockcode – blok kodu komputerowego,
summary – długi opis tabeli, zastąpi atrybut o tej samej nazwie,
access – skrót (np. klawiaturowy) do innego elementu, zastąpi atrybut accesskey,
standby – informacja wyświetlana podczas ładowania obiektu.
Aktualna, ósma wersja szkicu roboczego XHTML 2 była opublikowana 26 lipca 2006 r. 2 lipca 2009 r. konsorcjum W3C ogłosiło, że działanie grupy roboczej XHTML 2 nie zostanie przedłużone po jej wygaśnięciu z końcem 2009 roku. W zamian zostaną zwiększone zasoby na grupę roboczą HTML, czym W3C ma nadzieję przyspieszyć rozwój standardu HTML 5[3].
HTML5 (projekt)
-
Osobny artykuł: HTML 5.
Alternatywnie wobec XHTML2 jest rozwijany projekt HTML 5, przygotowywany przez W3C na podstawie projektu specyfikacji Web Applications WHATWG. Serializacja HTML 5 dla XML jest określana jako XHTML5.
Modularyzacja XHTML
W 2001 r. dokonano podziału XHTML na moduły. Zdefiniowano równocześnie reguły tworzenia nowych modułów, a także reguły, wedle których moduły bywają łączone. Umożliwia to wykonywanie nowych języków składających się z elementów XHTML, a mogących też zawierać elementy spoza XHTML; nazywa się je językami rodziny XHTML. Pewne języki rodziny XHTML to:
W oparciu o modularyzację powstał także XHTML 1.1. Dzięki temu da się bardzo łatwo dostosować ten język do swoich potrzeb. Dla przykładu rozszerzenie XHTML 1.1 o atrybut target (umożliwiający otwieranie strony w nowym oknie) sprowadza się do użycia trzech encji parametrycznych w DTD: [1]; przykład dokumentu wykorzystującego to DTD: [2].
Typy zawartości XHTML
- XHTML 1.0 spełniający zasady kompatybilności z HTML winno się wysyłać jako text/html tylko dla starszych przeglądarek. W tym typie zawartości dokument jest traktowany jak dokument HTML (aplikacja SGML-a) z błędami składniowymi, a więc m.in. nie jest sprawdzana poprawność składniowa, dokument jest traktowany jako tzw. "zupa znaczników", a dokument nie ma żadnych zalet poprawnego XHTML-a (w szczególności osadzania innych języków).
- Typ application/xhtml+xml stał się zbudowany specjalnie dla XHTML. Przeglądarki obsługujące ten typ automatycznie sprawdzają zgodność dokumentu z zasadami XML. W application/xhtml+xml nie ma już kilku nietypowych cech charakterystycznych dla HTML, np. element
body nie zachowuje się już tak, jak gdyby był elementem podstawowym (bo jest nim html), a przede wszystkim da się osadzać inne aplikacje XML bezpośrednio w kodzie XHTML. Odpowiednikiem wysłania pliku z tym typem na dysku lokalnym jest przeistoczenie rozszerzenia pliku z .html (lub .htm) na .xhtml (lub .xht).
- Typy application/xml oraz text/xml – są to natywne typy zawartości XML, a jako że XHTML jest aplikacją XML-a, da się ich używać równoważnie z application/xhtml+xml.
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 da się 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 albo inne kodowanie
Obejścia dla walidatora W3C oraz Chrome oraz Safari (WebKit) są konieczne, albowiem obsługują one XHTML, ale wysyłają w nagłówku Accept ciąg */* albo nie wysyłają go wcale, jak Walidator.
Inne przykłady odpowiednich skryptów da się znaleźć na tych stronach: [3], [4], [5].
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" "nullwww.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="nullwww.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"
"nullwww.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="nullwww.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="nullwww.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>
Przypisy
Linki zewnętrzne
Walidatory