Syntaxe XHTML

Co je XHTML - Verze XHTML - Rozdíly XHTML oproti HTML - Všechny hodnoty atributů jsou v uvozovkách - Zákaz křížení tagů - Tagy a atributy jsou malými písmeny - Nepárové tagy končí lomítkem - Párové tagy jsou párové povinně - Všechny atributu musejí mít hodnotu - Souhrnný příklad - Zápis javascriptu - Zápis interního stylu - Na začátku je XML deklarace (prolog)

Co je XHTML

XHTML je jiná, novější norma jazyka HTML. HTML jako takové se dlouho nevyvíjelo a zůstalo ve verzi HTML 4.01.

To X na začátku XHTML znamená eXtensible, rozšiřitelný (ve skutečnost jde o zúžení a osekání).

Podstatné je, že podpora jazyka XHTML je v současných prohlížečích naprosto stejná jako podpora HTML (psáno 2004, platí i pro 2009). Ačkoli se usuzuje, že v budoucnu bude podpora XHTML lepší než podpora HTML, na základě zkušeností s historickým vývojem prohlížečů není důvod se domnívat, že tomu tak vskutku bude.

Validita a význam XHTML

Tomu, že html/xhtml stránka splňuje normu (specifikaci, soulad s DTD), se říká validita. Mnozí autoři se validity kódu snaží dosáhnout. Validitu lze zkontrolovat validátorem. Současné prohlížeče ale zpravidla správně zpracují i nevalidní XHTML dokument a vykreslí jej dobře. Jinak řečeno -- je to stejně jako v HTML: pokud uděláte chybu, nestřílí se z toho.

XHTML oproti HTML nic nového nepřináší. Žádné nové možnosti, jenom omezení.

Taky bych měl připomenout, že já osobně nemám XHTML moc rád, protože ho považuji za zbytečně omezující. Validitu u veřejných dokumentů taktéž nevzývám. Účel světí prostředky, validita tím účelem není. Berte to prosím jako můj osobní názor. Konec mudrování.

Verze XHTML

XHTML se v praxi vyskytuje ve třech verzích:

Zatímco XHTML 1.0 transitional lze vcelku doporučit k používání, XHTML 1.0 striktní je velmi pracné a v XHTML 1.1 už je spousta věcí zakázána a jeho používání je pro značnou část autorů horor.

Kromě toho se kdysi začalo dělat XHTML 2.0, ale to byla úplná úchylnost a zřejmě slepá cesta.

Specifikace

XHTML 1.0 na W3C (anglicky).

Specifikace XHTML 1.1 (anglicky), tamtéž.

Doctype XHTML 1.0

<!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Nahlédnutím do odkazovaných souborů dtd se můžete podrobně seznámit s tím, které tagy a atributy jsou v dané verzi přípustné (stačí pochopit, jak je to DTD psané: chvíli na to koukat a pak je to jasné).

Doctype pro XHTML 1.1

<!DOCTYPE
 html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

Výklad DTD (anglicky)

Problémy s DTD a XML deklarací

Správně by HTML soubor měl začínat XML deklarací. Např. takto:

<?xml version="1.0" encoding="iso-8859-2"?>
<!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="en" >

Trochu lapálie je v tom případě s tím, že jakmile soubor nezačíná přímo zápisem <!doctype, nepozná Internet Explorer, že má stránku vykreslovat ve striktním módu. Neumím to řešit.

Další veselé chvilky začínají, když XHTML soubor s XML prologem <?xml version="1.0" ?> generujete přes PHP. PHP si myslí, že zápis <?XML patří jemu, a začne blbnout. To se řeší třeba tak, že se nechá ta XML deklarace vypsat pomocí PHP příkazu echo:

<? echo "<?XML version=\"1.0\" encoding=\"iso-8859-2\"?" . ">" ?>

Nebo ještě lepší je tam ten xml prolog nedávat, čímž sice vzniká nesprávně kódovaný dokument, ale zase to funguje i v Exploreru 6 se standardním vykreslováním.

Rozdíly XHTML oproti HTML

Některé věci platily už v HTML, XHTML je striktně vyžaduje:

Jaké jsou rozdíly XHML oproti HTML:

V dalším výkladu probírám jednotlivé rozdíly

Funkčnost versus soulad se specifikací

Prosím uvědomte si rozdíl mezi pojmy "je správně" a "funguje". V případě XHTML i HTML hodně běžně používaných zápisů není správně (tj. nejsou validní nebo nejsou v souladu se specifikací), ale v prohlížečích fungují. (Zhruba to platí i naopak -- mnohé věci ze specifikace nefungují.)

Většina prohlížečů totiž používá pro vykreslení XHTML stránek starý parser určený na HTML. V nich platí víceméně zásada, která říká, že co se nezná, to se ignoruje. Pak platí, co říkám: když se něco zkazí, tak se stránka stejně vykreslí.

Jsou ale případy, kdy toto neplatí a je třeba maximální soulad se specifikací. Když nastavíte server tak, aby odeslal XHTML dokument s hlavičkou Content-type: x-application/xhtml-xml a dotane ho některý moderní prohlížeč (např. Mozilla), pro XHTML dokumenty se pak může použít jiný parser, totiž v podstatě XML parser. Tento parser vyhnije na každé drobné chybce a uživateli se pak stránka vůbec nezobrazí.

Pokud chcete, můžete si na serveru nastavit, že se xhtml dokumenty budou s touto hlavičkou odesílat. Musíte si potom ale dát opravdový pozor, co jak na stránce děláte.

Jestliže nevíte, co to ta hlavička je, můžete být v klidu -- skoro všechny servery ve výchozím nastavení odesílají XHTML stránky s hlavičkou pro HTML, která žádné problémy nezpůsobuje.

Všechny hodnoty atributů jsou v uvozovkách

V HTML se nemusejí hodnoty atributů, které neobsahují mezeru, uzavírat do uvozovek. Když například napíšu kód pro obrázek

<img src=obrazek.gif width=100 height=91>

tak to bude v prohlížečích fungovat a podle starších verzí HTML to je i správný zápis. V XHTML se ale kolem všech hodnot vyžadují uvozovky:

<img src="obrazek.gif" width="100" height="91" />

Dávat uvozovky kolem hodnot je mimochodem dobrý mrav i v normálním HTML. Kód je rozhodně přehlednější a lépe se automaticky zpracovává.

Uvozovky se mohou nahradit apostrofy:

<a href='adresa'>odkaz</a>

Zákaz křížení tagů

Toto se třeba nesmí:

<b><i>tučná kurzíva</b></i>

takto je to správně:

<b><i>tučná kurzíva</i></b>

Křížení tagů se samozřejmě nesmělo už v HTML. Ironií zůstává, že když takovouto neplatnou křížovou konstrukci vyrobíte, prohlížeče to většinou vezmou a pochopí. XML parser to nevezme a nepochopí.

Tagy a atributy jsou malými písmeny

V HTML bylo jedno, jestli se píše <A HReF="..."></a> nebo <a href="..."></A>. HTML je tedy jazyk non-case sensitivní, takže v něm na velikosti písmen nezáleží.

Naopak XHTML je jazyk case sensitivní a na velikosti písmen v něm záleží (jako v každém jiném XML).

Navíc, podle specifikace se všechny tagy a atributy píšou malými písmeny. Takže například

Další příklady doufám nejsou potřeba. Já k tomu dodám dva postřehy:

Nepárové tagy končí lomítkem

V HTML je spousta tagů nepárových. Například obrázek (<img>) nebo čára (<hr>). V XML -- a tedy i v XHTML -- nic jako nepárový tag neexistuje. Když to vezmu na příkladu horizontální čáry (tag <hr>), tak:

Takže zjednodušeně řečeno nepárové tagy v sobě mají na konci lomítko. Taková úprava je co do funkčnosti zpětně kompatibilní s HTML -- když do HTML tagu napíšete lomítko, tak to prohlížeč pochopí jako neznámý parametr a ignoruje to. Proto nepárové tagy s lomítkem nedělají problémy v HTML ani v XHTML.

Opět si musíte uvědomit, že pokud píšete v XHTML a to lomítko tam nedáte, tak sice nemáte validní zápis, ale v prohlížeči to fungovat bude.

Na druhou stranu pokud píšete v HTML, tak lomítko jako neznámý parametr není v HTML validní. To sice prakticky nevadí, ale občas je to k smíchu. Vždycky si představím toho bastliče, jak sice píše HTML, ale aby šel s módou a aby spasil svět (XHTML přece spasí svět, nebo ne?), tak tam práská lomítka, aniž by věděl, proč to dělá.

Pamatujte: před zavíracím lomítkem má být mezera. Zápis

<br/>

(a podobné) je nejen nesprávný, ale hlavně může opravdu chybovat. Vyhodnotí se jako neznámý tag, který by prohlížeč měl ignorovat, ale těžko říct, jestli se tak skutečně stane. Může se tedy stát, že  v různých prohlížečích bude kód <tag/> fungovat různě chybně.

Shrnutí o lomítku:

Toto je správně v HTML a nesprávně v XHTML:

<br>

toto je správně v XHTML a nesprávně v HTML:

<br />

a v obou případech v prohlížečích funguje oboje.

Párové tagy jsou párové povinně

Prohlížečům nevadí, když se nějaký tag občas neuzavře. Například tag <p> se nemusel dříve uzavírat, protože když prohlížeč na stránce viděl další tag <p>, tak si ten předchozí v duchu uzavřel -- to protože jeden odstavec nemůže být částí druhého. Nebo podobně to funguje u buněk tabulky -- u tagu <td>. Když začnu jedno <td>, neuzavřu ho (nedám tam </td>) a pak napíšu další <td>, tak si prohlížeč řekne: aha, další buňka, to ta předtím skončila. A chybějící </td> si doplní. (Podobně funguje např. tag. option.)

Takový přístup je v praxi přípustný (ačkoliv jej nedoporučuji). Starší verze HTML neuzavírání některých tagů akceptovaly. Novější verze HTML a XHTML neuzavírání párových tagů zapovídají. Všechny párové tagy se tedy musejí uzavírat a mít v dokumentu svůj protějšek.

Samozřejmě doporučuji všechny tagy striktně zavírat, ať už píšete v XHTML nebo v HTML. Co konkrétně prohlížeč vydejchá, pokud nechcete některé tagy uzavírat, musíte vždycky vyzkoušet.

Všechny atributy musejí mít hodnotu

V HTML se občas vyskytují atributy, které namají hodnotu. Třeba u tagu select (rozevírací nabídka) se vyskytují atribut multiple nebo disabled. Atribut multiple například dovoluje vybrání více položek z nabídky (podržením klávesy Ctrl) a do kódu se v HTML zapisuje například takto:

<select name="auta" size="3" multiple>
... několik tagů <option> ...
</select>

Podstatné je to multiple, všimněte si, že nemá hodnotu (není tam žádné multiple rovná se něco).

V XHTML je ale atribut bez hodnoty zakázaný. Aby byl zápis zpětně kompatibilní s HTML, přidává se atributu v XHTML nějaká vycpávková hodnota. Takže například

multiple="multiple"

Výše uvedený příklad se selectem v XHTML vypadá takto:

<select name="auta" size="3" multiple="multiple">
... několik tagů <option> ...
</select>

Jediná změna je tam to ="multiple".

Podobně se rozvádějí další atributy, např. disabled="disabled", readonly="readonly" (oboje u formulářových polí), noresize="noresize" u tagů <frame> a <iframe> apod.

Souhrnný příklad

Všechno se píše malými písmeny a ty značky, kterým se říká "párové", musí být uzavřené. Všechny atributy musí mít přiřazenu hodnotu, všechny hodnoty atributů musí být v uvozovkách (i čísla).

Například takovýhle HTML kód:

<select multiple>
<option>opt1
<option>opt2
</select>
<img src="x.jpg" width=10 height=10>

V XHTML se tentýž kód zapíše takhle:

<select multiple="multiple">
<option>opt1</option>
<option>opt2</option>
</select>
<img src="x.jpg" width="10" height="10" />

Zápis javascriptu

Skript je v XHTML chápán jako neznámý puding, tedy beztvarý kus dokumentu. Musí se obalit zápisem CDATA. Zápis samotného řetězce CDATA je potřeba ještě javascriptově zakomentovat, aby se nevyhodnocoval.

<script type="text/javascript">
/* <![CDATA[ */
samotný zápis javascriptu
/* ]]> */
</script>

Uvnitř skriptu se nesmí použít sekvence </x, kde x je písmenko. Potřebujete-li něco takového zapsat, zapisujte ji takto: <\/x. (Zápis \/ je jenom escapovaná verze lomítka.)

Externí skript se naštěstí zapisuje stejně jako v HTML a uvnitř externího skriptu není žádné omezení.

<script type="text/javascript" src="externi-skript.js"></script>

Zápis interního stylu

To samé jako javascript. Přes kopírák - zapoznámkované CDATA. Ale ve většině případů to CDATA ani poznámkování není nutné, pokud v zápisu stylu nepoužíváte žádné problematické znaky jako třeba & > a <. Zejména pozor na znak > (css selektor potomka).

Na začátku je XML deklarace (prolog)

<?xml version="1.0" encoding="iso-8859-2"?>

<?xml version="1.0" encoding="windows-1250"?>

<?xml version="1.0" encoding="UTF-8"?>

Samozřejmě záleží na použitém kódování. Pozor, tento zápis nenahrazuje meta tag pro kódování češtiny (zejména Google pak může mít problémy). V praktickém použití na webu se tento prolog většinou vypouští, protože (ačkoli tak vzniká neplatný dokument) Explorer 6 chce mít na prvním řádku doctype.

 

Reklama

www.c4.cz, hosting za 1.200 Kč na rok s doménou v ceně

 

 

 

o tvorbě, údržbě a zlepšování internetových stránek

Návody HTML CSS JavaScript Články Ostatní

HTML tagy Abecedně Příklady HTML tahák

 

Jak psát web píše Yuhů, Dušan Janovský. Kontakt. Poslední aktualizace 27. prosince 2009.