Kdysi dávno jsem narazil na tenhle Pixyho příspěvek ohledně spolehlivosti W3C validátoru. Pixy se tam zmiňuje o chybách jak charakteru nevalidní stránky označené za validní, tak i obráceně. Pro první případ má připraveny i dvě ukázky, leč jak se později ukázalo v diskusi, ani jedna z nich nepoukazuje na chybu validátoru. V první z nich totiž Pixy nevědomky použil jeden hodně obskurní prvek SGML syntaxe (o kterém jsem rovněž neměl nejmenší ponětí, dokud ho tam v diskusi někdo nezmínil), v druhé sice atribut width skutečně obsahuje hodnotu specifikací zapovězenou, nicméně jde o záležitost, kterou DTD nedokáže postihnout a ve specifikaci je upřesněna běžnou řečí, proto tuto situaci těžko lze popisovat jako chybu validátoru, který validuje právě podle DTD. Pokud jde o ten druhý případ, tedy validní stránku označenou jako nevalidní, tam Pixy zmiňuje, že nějaký příklad měl i na to, ale že ho není schopen zreprodukovat.
Proč o tom celém píšu a navíc po takové době. Z nějakých
důvodů jsem si potřeboval vyrobit (skoro) minimalistický XHTML dokument a
dospěl jsem k něčemu následujícímu:
<?xml version=„1.0“ encoding=„utf-8“?>
<!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“>
<head>
<meta http-equiv=„content-type“ content=„text/html;
charset=utf-8“/>
<title>Titulek</title>
</head>
<body>
</body>
</html>
Byl jsem trochu překvapen, když mi W3C
validátor oznámil, že tento kód není validní, neboť mu chybí obsah
elementu body. Na jednu stranu jsem to byl ochoten akceptovat, na druhou stranu
jsem byl zvědavý a rozhodl se přesvědčit. Po troše pátrání v DTD
(protože v XHTML 1.1 je již vše modularizováno do spousty
souborů) jsem našel kýžené místo definice obsahu elementu body
v souboru xhtml-struct-1.mod.
Konkrétně patřičná oblast vypadá takto:
<!ENTITY % body.element „INCLUDE“ >
<![%body.element;[
<!ENTITY % body.content „( %Block.mix; )*“
>
<!ENTITY % body.qname „body“ >
<!ELEMENT %body.qname; %body.content; >
<!-- end of body.element -->]]>
Vypadá to trochu divoce, ale když se člověk zaměří na to podstatné, tak ať už je entita Block.mix cokoliv (konkrétně je definována pomocí dalších entit, takže bych musel provést nějaké rekurzivní rozvedení, do čehož se mi nechce), hvězdička hovoří jasnou řečí – body nemusí mít obsah žádný.
Toto mě zaujalo a začal jsem pátrat po tom, jak to bylo dříve. Nejprve jsem se domníval, že je to rozdíl mezi verzí 1.0 a 1.1, protože v DTD XHTML 1.0 (Strict) jsem našel toto: <!ELEMENT body %Block;> (zde žádná hvězdička nefiguruje). Nicméně tento závěr se ukázal ukvapeným, poněvadž samotná entita Block je definována takto: <!ENTITY % Block „(%block; | form | %misc;)“>, tedy i zde nalézáme hvězdičku zajišťující možnost prázdného body.
Šel jsem tedy ještě dál v historii, k HTML 4.01. Tam najdeme následující pravidlo: <!ELEMENT BODY O O (%block;|SCRIPT)+ +(INS|DEL) – document body -->. To už je něco úplně jiného, tady vidíme, že body prostě něco obsahovat musí.
Vede mě to ke dvěma otázkám, které mě trochu zneklidňují. První z nich je, podle jakého DTD tedy ten validátor XHTML validuje? Protože podle XHTML DTD to nejspíš není (nemají-li nějakou verzi upravenou oproti té ve specifikaci) a podle HTML DTD to zase ale také být nemůže. Druhá potom zní – sama specifikace XHTML 1.0 říká hned na začátku, že se jedná pouze o reformulaci HTML 4.01 v řeči jazyka XML, tedy mimo jiné že všude tam, kde to šlo, se plně zachovávají vlastnosti HTML – jenže tady by tu vlastnost očividně zachovat šlo, přesto to tak není; kolik asi podobných skrytých odchylek, o kterých se nikde nepíše, tam je?
Budu jenom rád, když mě někdo upozorníte na nějakou chybu v mých úvahách, na něco, co jsem přehlédl, ale zatím to prostě vidím takhle.

Sleduj všetky zápisy pomocou RSS
Sleduj všetky komentáre pomocou RSS
heh, ked citam taketo prispevky tak som rad ze pracujem s flashom :)