XHTML/媒體型別
推薦的媒體型別 用於 XHTML 是application/xhtml+xml;理想情況下,這將把 XHTML 作為 XHTML 提供服務。截至 2006 年 12 月 31 日,只有基於 Gecko 和 Presto 的佈局引擎(分別為 Firefox 和 Opera)支援這種媒體型別。要讓你的 XHTML 被讀取為 XHTML,請將你的標記儲存為.xht 副檔名。
除了符合 XML 的所有規則外,我們強烈建議你在將 XHTML 作為 XHTML 提供服務時遵守以下實踐
- 推薦使用 XML 樣式表 PI(處理指令)來關聯外部樣式表
<link rel="stylesheet" type="text/css" href="/mystyle.css">
<?xml-stylesheet type="text/css" href="/mystyle.css"?>
<?xml-stylesheet type="text/xsl" href="/mystyle.xsl"?>
XHTML 的另一種媒體型別是通用 XML 媒體型別application/xml。這種媒體型別受到大多數佈局引擎的支援,包括 Gecko、Presto、Web Core、KHTML 甚至 Trident,儘管只有兩個——Gecko 和 Presto——將其作為 XHTML 提供服務;其餘的將其作為 XML 提供服務,這可能導致一些怪癖。也就是說,這是跨相容性的首選媒體型別。將 XHTML 作為 XML 提供服務具有 XML 解析的優點,這意味著與text/html(將 XHTML 作為 HTML 提供服務)不同,XML 語法和 XHTML 語法之間不會出現衝突,因為它們都是相同的。要讓你的 XHTML 被讀取為 XML,請將你的標記儲存為.xml 副檔名。
除了符合 XML 的所有規則外,我們強烈建議你在將 XHTML 作為 XML 提供服務時遵守以下實踐
- 我們鼓勵所有作者透過更高級別的協議設定字元集引數(這可以透過 PHP 等指令碼語言完成)。如果你無法使用該方法(即使你能夠使用該方法),你應該透過 XML 宣告定義你的字元編碼
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?xml version="1.0" encoding="utf-8"?>
第三種選擇是透過text/html 將 XHTML 作為 HTML 提供服務。這實際上會破壞使用 XHTML 進行程式設計的大多數目的,因為 HTML 既不受 XML 解析的約束,也不可擴充套件。此外,將有效 XHTML 作為 HTML 編寫的唯一方法是遵守兩種語言的規則——即使這些規則相互衝突(例如,關於空元素的規則)。最後,HTML 規則適用於 DOM 指令碼和樣式表。
在將 XHTML 作為 HTML 提供服務之前,我們鼓勵你檢查這樣做的目的。一些值得問的問題可能包括:我是否想利用 XML 的可擴充套件性?我是否想讓我的標記被解析為 XML?我是否會利用 XSL 樣式表?如果所有這些問題的答案都是否定的,那麼 HTML 4.01 可能是更好的選擇。但是,如果你決心將 XHTML 作為 HTML 提供服務,XHTML 1.0 Transitional 在技術上允許這樣做。要讓你的 XHTML 被讀取為 HTML,請將你的標記儲存為.htm 副檔名,並確保你的 DTD 是 XHTML 1.0 Transitional。
出於 XHTML 的目的,內容協商是指透過嵌入式指令碼語言(Javascript、PHP)向某些佈局引擎提供一種媒體型別,而向其他佈局引擎提供另一種媒體型別的做法。使用內容協商和簡單地使用text/html 媒體型別提供 XHTML 之間的區別在於,內容協商通常(雖然不總是)將 HTML 作為 HTML 提供服務,而不是將 XHTML 作為 HTML 提供服務。換句話說,根據 UA(使用者代理)的不同,檢視原始碼會顯示 HTML DTD 或 XHTML DTD、XML 宣告或 Content-type 元標記、XML 樣式表 PI 或連結的樣式表。這意味著透過明智的指令碼編寫,可以編寫有效的 XHTML,而無需考慮 HTML 的規則,並利用 XML 的可擴充套件性和高效處理來支援佈局引擎,同時使用大部分相同的標記編寫有效的 HTML(不包括上述可擴充套件性和處理)來支援其他佈局引擎。
使用不同的媒體型別提供格式良好的 XHTML 文件時的響應。
| Trident | Tasman | Gecko | WebCore | KHTML | Presto | iCab | |
|---|---|---|---|---|---|---|---|
| application/xhtml+xml | 提示下載 | 提示下載 | XHTML | XML | HTML | XHTML | (X)HTML |
| application/xml | XML | 崩潰 | XHTML | XML | XML | XHTML | 文字 |
| text/html | HTML | HTML | HTML | HTML | HTML | HTML | HTML |
- application/xml——為了在基於 Presto 的佈局引擎(如 Opera、Opera Mini 或 Opera Mobile)中獲得 XML 處理的優勢,必須使用 XSL 樣式表將 XHTML 轉換為 XML。[1].
- application/xhtml+xml、application/xml、text/xml——HTML 實體和由自定義 DTD 定義的自定義實體不被識別。
- application/xhtml+xml——KHTML 支援這種媒體型別,但將文件作為 HTML 處理。
- application/xml、text/xml——HTML 實體和由自定義 DTD 定義的自定義實體不被識別。
- application/xhtml+xml——CSS 中的型別選擇器不區分大小寫。
將以下文件儲存為兩個副本,一個為 badlyFormed.html,另一個為 badlyFormed.xhtml。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Not well-formed</title> </head> <body> <p>An XHTML-compliant browser should refuse to render any part of this page.</p> <p>This paragraph is <b><i>not</b> well-formed</i>. </body> </html>
根據 XHTML 規範所基於的 XML 規範,符合標準的瀏覽器應該拒絕渲染文件的任何部分。相反,它應該返回一條錯誤訊息。開啟 badlyFormed.xhtml。你應該收到一條類似於以下訊息的錯誤訊息
XML Parsing Error: mismatched tag. Expected: </i>. Location: file:///D:/Practice/XHTML/BadlyFormed.xhtml Line Number 8, Column 35: <p>This paragraph is <b><i>not</b> well-formed</i>. ----------------------------------^
如果您沒有收到錯誤訊息,則可能是 MIME 型別設定不正確或您的瀏覽器不相容。Microsoft Internet Explorer 版本 7.0 及更低版本不相容。Mozilla Firefox 相容(至少從版本 1.0 開始,可能在更早的版本中也相容)。
使用 Firefox,您可以檢查頁面的 MIME 型別。從工具選單中選擇頁面資訊選項。在常規選項卡上向下三行是“型別:”。badlyFormed.xhtml 的型別應該是application/xhtml+xml。如果不是,則您沒有將副檔名.xhtml對映到application/xhtml+xml。
現在嘗試用 Firefox 開啟 badlyFormed.html。該頁面可能會顯示,與 XHTML 規範相反。檢查 MIME 型別。它應該是text/html。這意味著 Firefox 將文件解析為 HTML,而不是 XHTML。網頁瀏覽器通常會顯示 HTML,無論頁面上是否有任何錯誤,因此該頁面會呈現。