Proč je odesílání XHTML jako text/html špatné

2006-04-09 14:13 napsal Lukáš Havrlant

Pokud píšete v XHTML, měli byste odesílat stránku jako application/xhtml+xml. Pokud však dodržíte směrnici kompatibility (viz také předchozí článek Jak na dokonalé XHTML), je specifikací povoleno posílat dokument jako obyčejné HTML, tedy jako text/html. Důležitý fakt je, že s dokumentem je nakládáno jako s každou jinou HTML stránkou, žádný prohlížeč ji nevykresluje jako XHTML, žádný prohlížeč ji vlastně ani nesmí začít vykreslovat jako XHTML. Tedy naprostá většina XHTML stránek na webu se vykreslují jako HTML dokumenty. Ovšem nyní nastává problém, protože XHTML validní dokument není zároveň validním HTML dokumentem. Tedy posíláte-li XHTML jako text/html, jednoduše nutíte prohlížeče vykreslovat nevalidní HTML stránku.

Chyba první a chyba patrně největší. V HTML je povolen Shorthand markup tedy zkrácený zápis elementů. Například takto:

<strong>Běžný zápis</strong>
<strong/NET zápis/
<br> Běžný zápis
<br/ NET zápis

Všichni patrně vidíte ten problém. V XHTML je doporučeno používat zápis <br />, ale v HTML by teoreticky mělo lomítko ukončovat značku br a tedy ta závorka je tam již navíc. Prakticky žádný známý prohlížeč se však takto nechová. Přesto je tedy tento XHTML zkrácený zápis elementů formálně s HTML syntaxí nekompatibilní. Ovšem pokud prohlížeče nepodporují NET zápisy, musí vnímat ono lomítko jako neznámý atribut nebo prostě jako klikyhák, který nemá ve značce co dělat. Tudíž touto XHTML syntaxí nutíte prohlížeč vykreslovat nevalidní HTML dokument. Ať už z teoretického nebo z praktického pohledu.

V XHTML existují atributy, které se v HTML nevyskytují a tudíž jejich používáním opět vytváříte nevalidní HTML dokumenty. Jedná se především o atribut xmlns který by měl obsahovat každý striktně shodný XHTML dokument, ale také o atributy xml:lang nebo xml:space, které se v XHTML dokumentu mohou vyskytnout. Prohlížeč není povinen neznámé atributy přehlížet, ve specifikaci HTML je to pouze nenormativní poznámka, kterou tudíž prohlížeč nemusí dodržet (fakt je, že se naprostá většina prohlížečů stejně takto chová).

Dále pak XHTML doctype není validním HTML doctypem. Drobnost, ale je to tak.

Směrnice kompatibility říká, že atribut id může obsahovat tyto hodnoty: [A-Za-z][A-Za-z0-9:_.-]*, ovšem errata XML namespace tvrdí, že atributy typu ID nesmí obsahovat dvojtečku. Ovšem tady vzniká nekompatibilita spíše na druhé straně.

Zajímavá je také XML deklarace. Má tam být nebo tam nemá být? Podle specifikace tam být musí, pokud má dokument jiné kódování než UTF nebo nebylo vyšší protokolem určeno jiné. Podle směrnice kompatibility by dokument neměl obsahovat XML deklaraci, protože některé prohlížeče ji interpretují jako běžný text. Na toto téma jsem se nedávno bavil s Vilémem Málkem, ale řekl bych, že k jasnému závěru jsme nedošli. Takže ještě jednou. I HTML samotné může obsahovat instrukce pro zpracování začínající <?:

Documents conformant to HTML 2.0, HTML 3.2 and HTML 4.0 will start with a DOCTYPE declaration „<!DOCTYPE HTML“ near the beginning, before the „<html“. These dialects are case insensitive. Files may start with white space, comments (introduced by „<!--“), or processing instructions (introduced by „<?“) prior to the DOCTYPE declaration.

Ovšem některé starší prohlížeče tyto instrukce prostě nezvládají a normálně je zobrazí jako běžný text, což rozhodně není správné zobrazení, proto také směrnice kompatiblity obsahuje bod C1, který říká, že bychom se pokud možno měli těmto XML deklaracím vyhnout. Ovšem – jak říká Vilém Málek – není tam klíčové slovo nesmí. To ostatně není skoro v žádném bodu kompatibility, která ani sama o sobě není normativní, pouze informativní, takže v podstatě mohu splňovat směrnici kompatiblity, aniž bych se na ni podíval, protože úprav, které musím udělat, je tam skutečně poskrovnu. Stručně řečeno, některé prohlížeče zobrazí XML deklarace jako text, což není správné zobrazení, proto by XHTML dokument posílaný jako text/html tyto deklarace obsahovat neměl.

Podle specifikace samotné existují i prohlížeče, které nedokáží zpracovat logické atributy ve své plné formě, tj. například readonly="readonly".

Z výše uvedeného vyplývá, že pokud chcete napsat validní dokument, se kterým by prohlížeče neměly žádné problémy (tedy myslím to tak, aby ve skutečnosti nemusely vykreslovat nevalidní kód), neměli byste používat XHTML a posílat ho jako text/html, ale buď ho posílat s preferovaným MIME typem nebo používat HTML.

Linkuj.cz!

Komentáře

9. April 2006, 15:34

MIME přece nepředesílá DTD, ale jen režim parseru. Proto není důvod k závěrům typu „posíláte-li XHTML jako text/html, jednoduše nutíte prohlížeče vykreslovat nevalidní HTML stránku“.

Chápu nadměrnou úzkostlivost nad současným stavem, neboť „naprostá většina XHTML stránek na webu se vykreslují jako HTML dokumenty“ je těžká pravda reality, ale dokud nebudou dokumenty autorovány v XML prostředí XML nástroji, nebude to jiné. Stejně tak je potřeba počkat na dobu, kdy budou připraveny browsery. Do té doby je potřeba si XML kompatibilitu zažít ve zpětně-bezpečném tolerantním (ačkoliv by někdo řekl „špatném“ či „neplatném“) prostředí, než bude ostře používána.

9. April 2006, 15:35

Hezké shrnutí, držím palce v této osvětové činnosti a jdu vytvořit další „validní“ XHTML dokument, protože to tak chce zaměstnavatel. :o)

9. April 2006, 15:46

Podobně zavádějící mi taktéž přijde „některé prohlížeče zobrazí XML deklarace jako text, což není správné zobrazení, proto by XHTML dokument posílaný jako text/html tyto deklarace obsahovat neměl“, což je podobně „progresivní“ paralela výroku „některé prohlížeče neumí správně nakládat s pseudoelementy v CSS, což není správné zobrazení, proto by CSS dokument tyto deklarace obsahovat neměl…“.

Omlouvám se za možná ironický až jízlivý tón, ale zkus to spíš brát jako mé neschopné formulování dotazu na ony formální věty, než na nějakou neslušnou formu nesouhlasu.

9. April 2006, 16:01

Jan Brašna

MIME přece nepředesílá DTD, ale jen režim parseru. Proto není důvod k závěrům typu „posíláte-li XHTML jako text/html, jednoduše nutíte prohlížeče vykreslovat nevalidní HTML stránku".

Ale prohlížeč přece neví, že se jedná o stránku psanou XHTML syntaxí, vidí text/html a tak stránku vykresluje jako HTML a všechny věci popsané v článku jsou v HTML chybné. Pro lepší představu – představ si normální validní HTML stránku bez nějakých blbostí jako NET apod. Pak do některých značek vlož lomítko a do některých značek vlož neexistující atributy. Zdá se ti to v pořádku? Celé se to mimochodem točí kolem této věty:

[XHTML1] defines a profile of use of XHTML which is compatible with HTML 4.01 and which may also be labeled as text/html”

Jak jsem názorně dokázal, XHTML 1.0 rozhodně není kompatibilní s HTML 4.01.

některé prohlížeče neumí správně nakládat s pseudoelementy v CSS, což není správné zobrazení, proto by CSS dokument tyto deklarace obsahovat neměl…

Kaskádové styly bych do tohoto problému vůbec netahal. Ale tady se tak jako tak rozebírá jiný problém. W3C říká, že dva různé jazyky jsou (respektive mohou být) kompatibilní a já říkám, že nemůžou.

9. April 2006, 16:41

V kompatibilitě, na kterou referuješ, bych rozhodně nehledal ekvivalenci nebo záměnu typů dokumentů, ale pouze stanovený profil použití (který mimochodem zmiňuje RFC pouze v ohledu charakteru volby MIME a chování, nikoliv záměny typů dokumentů popř. tolerance renderu k SGML/HTML odlišnostem a alternativám). Pokud se Ti zdá tato formulace zavádějící, navrhni její změnu/odstranění na XHTML mailinglistu, nebo přímou úpravu RFC.

Na tomto základě ale stále nevidím důvod k výše uvedeným závěrům, které jsem citoval, neboť s tím po vlastní stránce logiky vyjádření nesouvisí.

Můžeš nějak podpořit výrok, že „prohlížeč přece neví, že se jedná o stránku psanou XHTML syntaxí, vidí text/html a tak stránku vykresluje jako HTML“? MIME není rozhodovací nástroj per se, v dnešní praxi opravdu ne. Zvaž, co pak v této situaci může znamenat zmíněný „profil použití“. Určitě jsou tedy všechny parsery chybné, nebo naopak tolerantní? A je tato tolerance proti normě, RFC, zvyklostem, popř. předpokládanému výsledku (a je ten předpoklad shodný napříč všemi, kteří o tom uvažují)? DTD roli nehraje?

Pokud ti hypotetická věta přijde scestná s CSS, tak ho do toho příkladu tahat nebudu, vlož si tam cokoliv jiného. Nejde o faktický obsah, ale o paralelu logického závěru. A opět se pokus abstrahovat od Tvého závěru neplatnosti onoho výroku ve specifikaci, který s citovanou větou a jejím závěrem nemá nic společného.

Přijde mi, že hledáš problémy tam, kde fakticky nejsou. A to na základě nějasně znějící citace RFC, která se objevila ve W3C Note dokumentu.

9. April 2006, 16:59

OT: U čtení tohoto článku jsem stihl sníst 5 kousků tvarohové buchty.

9. April 2006, 17:04

Z výše uvedeného vyplývá, že pokud chcete napsat validní dokument, se kterým by prohlížeče neměly žádné problémy (tedy myslím to tak, aby ve skutečnosti nemusely vykreslovat nevalidní kód),

A proč by měl mít prohlížeč problém s nevalidním kódem? Neznám žádný prohlížeč, který by odmítl vykreslit nevalidní stránku, konec konců současné prohlížeče nepoužívají skutečné SGML parsery, ale šílené parsery plné heuristik, které opravují různé syntaktické chyby vyskytující se v HTML stránkách. Znáte nějaký konkrétní příklad, kdy prohlížeč špatně zpracuje kód validní XHTML stránky, pokud ji načítá HTML parserem? (Připomínám, že různé zkrácené zápisy SGML není potřeba řešit, protože prohlížeče nikdy nepoužívaly skutečný SGML parser, který by tyhle specialitky SGML znal.)

9. April 2006, 17:16

Jan Brašna

Pokud se Ti zdá tato formulace zavádějící, navrhni její změnu/odstranění na XHTML mailinglistu, nebo přímou úpravu RFC.

To už udělali jiní a jinde a mimochodem byl minimálně jednou citován i na Tebou zmiňovaném mailinglistu

Můžeš nějak podpořit výrok, že „prohlížeč přece neví, že se jedná o stránku psanou XHTML syntaxí, vidí text/html a tak stránku vykresluje jako HTML“?

A jak jinak by ji měl vykreslovat? Kdyby ji vykresloval jako XHTML, neměl by text na této stránce červené pozadí a samotné by bylo vykresleno červenou barvou jako na této stránce. Mimochodem kdyby se ta prvně odkazovaná stránka vykreslovala jako XHTML, nevykreslila by se vůbec.

DTD roli nehraje?

Pokud vím, Doctype pouze přepíná módy prohlížečů a nikdy jsem neslyšel nic o tom, že by to současně zahrnovalo i rozdílnou interpretaci HTML a XHTML syntaxe. Můžeš nějak dokázat, že roli hraje?

Přijde mi, že hledáš problémy tam, kde fakticky nejsou.

To je asi pravda. Z praktického hlediska je to v současnosti jedno, současným prohlížečům je to šumafuk a sežerou to.

9. April 2006, 17:29

zimmi
A to je dobře nebo špatně? :-)

Jirka Kosek

A proč by měl mít prohlížeč problém s nevalidním kódem?

Nepatřím mezi přísné zastánce validního kódu, ale někdo třeba ano a tomu jsem chtěl ukázat i opačný pohled na vzniklou situaci. Jinak máte samozřejmě pravdu.

Znáte nějaký konkrétní příklad, kdy prohlížeč špatně zpracuje kód validní XHTML stránky, pokud ji načítá HTML parserem?

Pokud dodržím směrnici kompatibility tak nejspíš ne, maximálně takový MSIE3 zobrazí ten XML prolog. Pokud ji nedodržím, tak už se nějaké příklady najdou.

9. April 2006, 17:52

Jak jinak? Jakkoliv :) Dáváš pouze černou a bílou možnost. Nikdy jsem nestudoval přesné postupy parserů (tj. analýza zdrojových kódů), proto nemám ani odpověď na Tvoji další otázku, ale z čistě praktického hlediska by měla koncová zařízení mít toleranci. Ať už přepínání režimů či chování parserů, nic nemusí být pouze situace „A“ a situace „B“, proto změna jednoho módu nemusí nutně evokovat změnu všech rutin či postupů zpracovávání dokumentu. Však to také předpokládám není nijak normované. Proto si myslím, že zaslání MIME, které XHTML mít v nějakých případech může, zcela jistě neústí v situaci, kdy „nutíte prohlížeče vykreslovat nevalidní HTML stránku“.

(Mimochodem Safari zobrazí oba příklady shodně.)

9. April 2006, 18:02

Jan Brašna

… z čistě praktického hlediska by měla koncová zařízení mít toleranci

Já se právě domnívám, že ta tolerance se rovná správné vykreslení de facto chybného kódu. Pochybuji, že by se prohlížeč řídil podle doctype, nějaký Franta, který tomu vůbec nerozumí, zkopíruje z jiné stránky chybný XHTML doctype a pak bude používat HTML syntax. V tu chvíli by tam zase to lomítko chybělo… Varianta, že si prohlížeč s tímto „teoreticky chybným“ kódem prostě poradí jako s jiným ne_úplně_správným kódem se mi jeví jako nejschůdnější.

Mimochodem Safari zobrazí oba příklady shodně

Mohu vědět jak? Safari nevlastním, ale Opera, FF i IE to vykreslí jinak.

9. April 2006, 18:23

De factode jure korektního kódu. A to i v Tvém interpretování, které jen mluví o komplikaci s rozlišením při interním zpracováním, nikoliv o kódu samotném. Pořád tady i v té další otázce vidím černá/bílá – já netuším, jak by měl browser nejvhodněji (pro praxi, nikoliv pro splnění teoretických předpokladů jako třeba Amaya…) rozpoznávat vhodný režim, ale rozhodně to nebude výhradně jen některým z faktorům. Viz Jiřího příspěvek. Tvůj další příklad používá jako předpoklad chybný postup, to je pak věcí error handlingu a defensivního zpracování, jaká bude volba. Ale taktéž bych řekl, že si s tím ony heuristické algoritmy poradí. To vše ale předpokládám není otázka řešení tohoto článku popř. bod neshody v diskusi. Ty ležely zcela jinde.

Safari oba příklady zobrazí jako černý text na červeném pozadí.

9. April 2006, 18:49

Asi to vidím černobíle, protože nevidím důvod k tomu, používat další barvy. Příklad:

Mám prohlížeč, který i v samotném HTML zvládá korektně interpretovat zápis <br />, protože zkrácené NET zápisy nezvládá a tak bere to lomítko jako klikyhák, který tam nemá co dělat a tudíž si ho odmyslí. Potom přijde XHTML se směrnicí kompatibility, která koneckonců spoléhá na to, že si prohlížeče to lomítko, které tam nemá být, odmyslí. Proč bych tedy zbytečně v mém prohlížeči zaváděl červený režim, při kterém by prohlížeč zápis <br /> zobrazil úplně stejně jako v bílém režimu, pouze by to bral jako správný zápis? IMHO by byl červený režim úplně zbytečný, nehledě na to, že jsem o něm nikdy neslyšel.

Safari oba příklady zobrazí jako černý text na červeném pozadí.

To je ale zvláštní, protože v obou příkladech styluji element, který v kódu nemám (tbody) a XHTML si rozhodně elementy domýšlet nemá…

9. April 2006, 19:14

Nejde o režimy ale o vodítka podle kterých se rozhodovat. Výsledek bude skutečně záviset na směsi více hodnot spíše, než než na variantách „A“ a „B“ jen podle např. MIME. Dál se budeme točit v kruzích. V kruzích plných teorie a slovíčkaření. Tvůj postoj jsem plně pochopil, jen si myslím, že v tom hledáš nějaký rozpor účelově, protože mi přijde chování browseru se specifikacemi slučitelné.

K Safari – podle DOM tam TBODY je přítomno. Můžeš nafilovat bug, chceš-li.

9. April 2006, 20:00

Jan Brašna

Tvůj postoj jsem plně pochopil, jen si myslím, že v tom hledáš nějaký rozpor účelově

Dá se říci, že jen ukazuji druhou stranu mince. Ale přiznávám, že už jsem asi hodně zaujatý. Každopádně děkuji za návštěvu a za diskusi :-).

9. April 2006, 20:12

Však to je záslužné o tom informovat, chtěl jsem si jen uspořádat své ideje v kontrastu těchto informací, protože to není v žádném případě moje oblast, takže díky jdou pochopitelně Tobě. Za diskusi se spíše omlouvám, ani nevím, co mě to při neděli napadlo se vrtat do podobných témat, příště se budu držet více zpět, slibuji :)

Pěkný den.

9. April 2006, 21:41

Lukáš Havrlant: To těžko říct, ale byla dobrá.

9. April 2006, 22:02

Tohle je opravdu zajímavý pohled na problematiku XHTML. Sice se nepovažuji ani za 10% odborníka, ale myslím si tohle: Když je stránka napsaná v XHTML 1.0 a odesílá se mime typ text/html, nemůže nastat chyba parsování, a v ideálním případě validátor označí její syntax za správný. Specifikaci neporušuje a prohlížeče ji zobrazí správně. Co víc si přát?

Upřímně, není to tak dávno, co jsem uvažoval na přechod zpět k HTML 4.01, ale nechce se mi to dělat z kariéristických důvodů. Kdo dnes nepíše v XHTML, ten je ze staré školy – to je alespoň všeobecné mínění.

9. April 2006, 22:12

Charlie:

Když je stránka napsaná v XHTML 1.0 a odesílá se mime typ text/html, nemůže nastat chyba parsování…

Pouze XHTML 1.0 nestačí, dokument ještě musí splňovat směrnici kompatibility, alespoň některé body jsou skutečně důležité.

…a v ideálním případě validátor označí její syntax za správný.

Nevím teď, jak to myslíš, ale HTML validátor XHTML dokument nikdy neoznačí za validní.

10. April 2006, 06:57

Lukáš Havrlant

… dokument ještě musí splňovat směrnici kompatibility…

Ano, to je pravda. Já jen nejsem natolik odborník, abych to vymyslel sám :)

… HTML validátor XHTML dokument nikdy neoznačí za validní.

Myslím XHTML validátor.

10. April 2006, 14:43

Super další flame :) Ihned přidávám do čtečky AH není žádné RSS článku, někde tu musí být…

hanopis smazán autorem webu

No Charlie pokud nejsi odborník alespoň z 54%, tak doporučuji mlčet :) viz dávno Dero…

Ostatní dopíši později nemám čas. Zdravím všechny…

BTW stejně se jede podle DTD a ne podle mime-type(u)… to jen tak pro další flame topic (ach ano další prázdné slovo (zase viz. Dero) ) Tak zatím, těšte se!

10. April 2006, 14:55

MiSHAK

BTW stejně se jede podle DTD a ne podle mime-type(u)…

Ne, je to přesně naopak. Pošlel-li stránku jako application/xhtml+xml, začne se vykreslovat jako XHTML, pokud ji pošleš jako text/html bude se vykreslovat jako HTML. Tečka. Doctype pouze přepíná režimy (což není standardní vlastnost), jinak na něj prakticky není brán zřetel (tedy u běžného prohlížeče). Mimochodem to netvrdím jenom já, ale třeba i Anne van Kesteren.

Existuje-li něco mezi jak říká Honza Brašna, netuším, ale v životě jsem o tom neslyšel. Asi napíšu někomu z Czilly, mohli by to vědět, případně na W3C mailing list.

Mimochodem Anne také napsala podobný článek jako je tento, narazil jsem na něj až teď.

11. April 2006, 15:09

Ok už mlčím ;-)

12. April 2006, 17:49

Timy, pekne napísané. Dúfam, že sa Ti podarí napísať viac podobných článkov. Sám som presvedčený o tom, že pravé XHTML je v dnešnej dobe nepoužiteľné. Počkáme si teda na IE 8 (ak vôbec vyjde), ktorý už snáď bude poznať application/xml+xhtml (IE 7 sa podľa mojich informácii na nič podobné nechystá).

Ešte jedna malá otázočka. Vedel by mi niekto povedať, aké praktické výhody má pre mňa používanie XHTML v dnešnej dobe? Prečo by som mal XHTML používať na vytvorenie nesprávnych HTML dokumentov?

12. April 2006, 17:54

Ešte čo sa týka MIME vs. DTD. Timy má samozrejme pravdu. Skúste si na servri nastaviť image/jpeg pre dokumenty .html a uvidíte, aký dôležitý je MIME typ.

14. April 2006, 17:47

Jakožto amatér a začátečník mám dotaz:

Pokud je mi známo, tak mime typ přiřazuje server podle koncovky souboru (.htm, .html) v hlavičce zasílané UA a je většinou nastavený na text/plain (text/html). Jaký potom má význam udávat mime typ v content=appli­cation/xhtml+xml, když UA (údaje v hlavičce stránky mají přednost) si to stejně zpracuje jako text/html?

P.S.: vím, že se to dá obejít v php zasíláním vlastního header(), nebo nějak (to zase nevím) pomocí .htaccess.

14. April 2006, 23:51

Peca

Jaký potom má význam udávat mime typ v content=appli­cation/xhtml+xml, když UA (údaje v hlavičce stránky mají přednost) si to stejně zpracuje jako text/html?

Žádný. MIME typ application/xhtml+xml se dá poslat buď použitím koncovky .xhtml nebo právě ten header(). Meta tag určující content type je tak maximálně na ozdobu :-).

15. April 2006, 00:38

A není to jedno, když to nezpůsobuje žádný praktický problém? To už mi přijde užitečnější zabývat se třeba právem, než rozebírat normy W3C, které ani normami nejsou. :-)

Nechci nějak prudit, jenom mi jančení kolem XHTML a CSS přijde zbytečné ve chvíli, kdy je celý vývoj zakonzervován Microsoftem.

15. April 2006, 12:31

Lukáš Havrlant: díky za info, tak nějak jsem to předpokládal.

Zrovna včera jsem si tady udělal ten testík a 42%, musím se učit, hodně učit.

Martin Snížek: jak jsem zde již napsal, jsem začátečník v (X)HTML a potřebuji si dost věcí ujasnit. Nejsem ve webdesignu profesionál a ani nechci být (mým oborem je měření a regulace), nicméně si myslím, že když už občas zaplevelím internet nějakým svým dílkem, mělo by to mít alespoň nějakou štábní kulturu. Na druhé straně, když ze všech stran slyším, že něco mám dělat tak a tak, prostě mi to nedá se poptat po smyslu takového konání. A konkréktně v uvádění MIME typu do meta tagu mi smysl ( s výjimkou neurčité a mlhavě definované dopředné kompatibility) trošku uniká. Tím nechci říct, že to tam nebudu psát, ale váha, kterou tomu přikládám je určitě menší, než bylo v dobách nedávno minulých.

Aby nevznikl špatný dojem, nejsem odpůrcem metajazyka XML, dokonce bych řekl, že třeba DOCBOOK dost nadšeně propaguji. Ale implementace XML do HTML (a pseudoimplementace XHTML v současných UA) má určitá „ale“, která je dobré znát a počítat s nimi.

P.S.: Váš seriál o xhtml na intervalu jsem si vytiskl už před rokem a nutno říct, že listy jsou, stálým používáním, už značně usmolené. Díky za něj.

Komentáře jsou uzavřeny