相關(guān)鏈接
補遺:對XML的實現(xiàn)者和規(guī)范作者的懇求
請不要把doctype嗅探帶到XML。
doctype嗅探是用簽雜燴湯似的方法解決一個標簽雜燴湯問題。doctype嗅探是在HTML4和CSS2規(guī)范發(fā)布后設(shè)計的一種試探方法,它從文檔中區(qū)分出過時文檔以符合其作者可能期望的行為。
偶爾有人建議在XML上使用doctype嗅探來調(diào)度不同的處理、識別正在使用的詞匯表或激活特性。這是個壞主意。調(diào)度和詞匯表識別應(yīng)該是基于名字空間的,而特性激活應(yīng)該是基于明確的處理指令或元素。
良構(gòu)(well-formedness)的整個思想是介紹允許XML的無DTD解析,且推廣無doctype文檔。在正式情況下,兩個XML文檔有相同的規(guī)范形式且應(yīng)用不同地處理它們(且不同之處并非因為沒有選擇處理外部實體),這個應(yīng)用或許被破壞了。在實踐情況下,如果兩個XML文檔導(dǎo)致同樣的內(nèi)容被報告(qnames忽略)給SAX2內(nèi)容處理器 且應(yīng)用不同地處理文檔,這個應(yīng)用或者被破壞了?紤]到作為 Web作者無法相信每個人都會使用解決額外實體的XMLprocessor來解析其頁面(即使一些瀏覽器看起來這樣做,因為它們會映射一定公共的標識符到一個有刪節(jié)的定義實體的DTD),插入doctype到XML中用于Web是毫無意義的且通常會導(dǎo)致貨運崇拜(cargo cultish)習(xí)慣。(您仍然使用W3C驗證器的DTD覆蓋功能 來對一個DTD進行驗證,雖然W3C驗證器會說結(jié)果僅僅是暫時有效;蚋玫氖牵憧梢杂放寬NG驗證 ,它不會污染模式引用的文檔。)為了嗅探而要求doctype是非常愚蠢的,即使那是在HTML實踐中的解決方法。
此外,當?shù)图墑e的規(guī)范定義兩個相等的東西時,高級別的規(guī)范不應(yīng)該嘗試給它們不同的含義。請考慮<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
。如果刪除公共標識符,依舊指定了同樣的DTD,因此doctype <!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
表示和前面的doctype一樣。應(yīng)該不同地嗅探它們么?可以進一步理論。假設(shè)復(fù)制給example.com一個叫foobar.dtd的DTD:<!DOCTYPE html SYSTEM "http://example.com/foobar.dtd">
。這該如何嗅探?應(yīng)該是同一個意思。甚至整個DTD可以貼在文檔中。
換句話說,如果有#include “foo.h”,你不應(yīng)該給名字foo.h綁定任何black magic,因為它應(yīng)該允許復(fù)制foo.h的內(nèi)容到文檔中或復(fù)制foo.h到bar.h中且表示#include “bar.h”。
我不擔心HTML和SGML構(gòu)造相同的參數(shù)的原因是Web瀏覽器不會使用真正的SGML解析器去解析HTML,所以我認為偽裝成SGML進行處理是沒有用的。無論如何,如果你還不相信,請看W. Eliot Kimber關(guān)于此事的文章 comp.text.sgml
附錄:text/html中一些doctype的處理方式
下表中,怪癖模式、標準模式和幾乎標準分別表示為Q、S和A。當瀏覽器僅有兩種模式時,如果表格單元格的行高和Mozilla的標準模式表現(xiàn)一致時,標準模式標記為“S”,如果表格單元格的行高和Mozilla的幾乎標準模式表現(xiàn)一致時,則標記為“A”。
請注意使用XML內(nèi)容模型提供服務(wù)的XHTML在XML模式下渲染。
本表的目的并不是說表中所有的doctype都是新建頁面的合理選擇。本表的目的是為了展示我的推薦是依據(jù)什么樣的數(shù)據(jù)。
下列的簡寫符號是用于列標題:
NS6
Mozilla 0.6…0.9.4 和 Netscape 6.0…6.2.3
Old Moz
Mozilla 0.9.5 到 1.1 alpha 和 Mozilla 1.0
Moz & Safari & Opera 10 & HTML5
Mozilla 1.0.1, Mozilla 1.1 beta和更高版本, Firefox 到 Netscape 7, Safari 0.9 到 Safari 4.0 beta, Opera 10, Chrome, Konqueror 3.5, HTML5指定的行為
Opera 9.0
Opera 9.0…9.20
IE 8 & Opera 9.5
無 X-UA-Compatible和兼容模式覆蓋的默認IE8(該情況下“A”意味著IE8幾乎標準模式)、 Opera 7.5…8.54 和 9.5…9.6
IE 7 & Opera 7.10
IE7、兼容模式且無X-UA-Compatible覆蓋的IE8(這種情況下“A”意味IE7模式)和Opera 7.10…7.23
IE 6 & Opera 7.0
Windows IE 6 和 Opera 7.0…7.03
Mac IE 5
Mac IE 5.0…5.2.3
Konq 3.2
Konqueror 3.2.2…3.3 (也可能包括 3.1…3.2.1; 我尚未確定)
運行代碼框 [Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
出處:隨網(wǎng)之舞
責任編輯:bluehearts
上一頁 用doctype激活瀏覽器模式 [3] 下一頁 用doctype激活瀏覽器模式 [5]
◎進入論壇網(wǎng)頁制作 、WEB標準化 版塊參加討論,我還想發(fā)表評論 。