XHTML

**可延伸超文本標示語言**（英語：e**X**tensible **H**yper**T**ext **M**arkup **L**anguage，XHTML），是一種標記式語言，表現方式與超文件標示語言（HTML）類似，不過語法上更加嚴格。從繼承關係上講，HTML 是一種基於標準通用標記式語言（SGML）的應用，是一種非常靈活的置標語言，而 **XHTML** 則基於可延伸標記式語言（XML），XML 是 SGML 的一個子集。XHTML 1.0 在 2000 年 1 月 26 日成為 W3C 的推薦標準。

XHTML1.1 為 XHTML 最後的獨立標準，2.0 止於草案階段。XHTML5 則是屬於 HTML5 標準的一部份，且名稱已改為「以 XML 序列化的 HTML5」，而非「可擴展的 HTML」。在今日 (2017 年)，XHTML5 比起 HTML5 仍遠遠並非主流。

## 概述

**XHTML** 是「3 種 HTML 4 檔案根據 XML 1.0 標準重組」而成的。而 W3C 亦繼續建議使用 HTML 4.01 和積極地研究 HTML5 及 XHTML 的計劃。於 2002 年 8 月發表的 XHTML 1.0 的建議中，W3C 指出 **XHTML** 家族將會是 Internet 的新階段。而轉換使用 **XHTML** 可以令開發人員接觸 XML 和其好處，並可以確保以 **XHTML** 開發的網頁於未來的相容性。

HTML 語法要求比較鬆散，這樣對網頁編寫者來說，比較方便，但對於機器來說，語言的語法越鬆散，處理起來就越困難，對於傳統的電腦來說，還有能力相容鬆散語法，但對於許多其他裝置，比如手機，難度就比較大。因此產生了由 DTD 定義規則，語法要求更加嚴格的 XHTML。

大部分常見的瀏覽器都可以正確地解析 XHTML，即使老一點的瀏覽器，XHTML 作為 HTML 的一個子集，許多也可以解析。也就是說，幾乎所有的網頁瀏覽器在正確解析 HTML 的同時，可相容 XHTML。當然，從 HTML 完全轉移到 XHTML，還需要一些過程。

跟 CSS（Cascading Style Sheets，層疊式樣式表）結合後，XHTML 能發揮真正的威力；這使實現樣式跟內容的分離的同時，又能有機地組合網頁代碼，在另外的單獨檔案中，還可以混合各種 XML 應用，比如 MathML、SVG。

從 HTML 到 XHTML 過渡的變化比較小，主要是為了適應 XML。最大的變化在於文件必須是結構良好的，所有標籤必須閉合，也就是說開始標籤要有相應的結束標籤。另外，XHTML 中所有的標籤必須小寫。而按照 HTML 2.0 以來的傳統，很多人都是將標籤大寫，這點兩者的差異顯著。在 XHTML 中，所有的參數值，包括數字，必須用雙引號括起來（而在 SGML 和 HTML 中，引號不是必須的，當內容只是數字、字母及其它允許的特殊字元時，可以不用引號）。所有元素，包括空元素，比如 img、br 等，也都必須閉合，實現的方式是在開始標籤末尾加入斜扛，比如 `<img ... />` 、`<br />`。省略參數，比如 `<option selected>`，也不允許，必須用 `<option selected="selected">`。兩者的詳細差別，可通過 W3C XHTML 說明 （頁面存檔備份，存於網際網路檔案館）來查閱。

## 版本

至現時為止，XHTML 共有以下幾個版本：

* **XHTML 1.0 Strict（嚴格版）** 是參照「HTML 4.01 Strict」改編，但不包括被棄用的元素。其檔案類型描述為：

* **XHTML 1.0 Transitional（過渡版）** 是參照「HTML 4.01 Transitional」改編，包括已於 Strict 版本被棄用的呈現性元素（例如 `<center>`, `<font>` 等）。其檔案類型描述為：

* **XHTML 1.0 Frameset（框架版）** 是參照「HTML 4.01 Frameset」改編，並允許於網頁中定義框架元素。其檔案類型描述為：

* **XHTML 1.1**。其檔案類型描述為：

* **XHTML Basic**。其檔案類型描述為：

另外，在 Microsoft Internet Explorer 5.0 所新增的 `<ruby>` 小字註解標籤，在 XHTML 1.1 得到支援（參看旁註標記）。 
而第二版的 XHTML 1.0 於 2002 年 8 月成為 W3C 推薦的檔案類型。

2.0 止於草案。

XHTML5 不需要 DTD。

## 有效的 XHTML 檔案

一個符合（附合）XHTML 標準的檔案即可稱為_有效_。此可以確保 XHTML 檔案代碼的協調，亦能令檔案的更容易被處理，而不需確保各種瀏覽器編譯的一致性。而 W3C 驗証服務則可以驗証檔案是否有效。而實際上，很多網站開發工具（例如 Dreamweaver）都支援以 W3C 標準驗証檔案。

## 語法

XHTML 語言必須符合 XML 的格式，例如，`<br>` 要寫成 `<br />`、使用了 `<p>` 之後必須有一 `个</p>` 以結束段落。而且，XHTML 標籤必須使用小寫字母，如 `<br />` 不能寫為 `<BR />`；每一個屬性都必須使用引號包住，如必須使用 `<img src="abc.jpg" alt="" />` 而不能使用 `<img src=abc.jpg alt="">`。這些做法的目的，是使一個 XHTML 網頁能夠被網頁瀏覽器正確及較快地編譯。

## 和 HTML 4 的區別

（翻譯自 W3C XHTML 說明 （頁面存檔備份，存於網際網路檔案館））這部分涉及內容廣泛。

XHTML 是 XML 的一種應用。基於這一事實，那些在以 SGML 為基礎的 HTML 4 中，不完全合法的用法，應被改寫。

### 文件應該是結構良好的

良好結構（Well-formed）是由 XML 引入的一個新概念。也就是說所有的元素都必須有結束標籤或者以特殊的方式書寫（如下所述），而且所有的標籤必須合理地巢狀。

儘管如此，交叉使用在 SGML 中仍然是合法的，而且在現有的瀏覽器中也能夠被廣泛接受。

　
: 正確：元素嵌套

　
: `<p><em>這是一個要強調的段落。</em></p>`

　
: 錯誤：元素交叉

　
: `<em><p>這是一個要強調的段落。</em></p>`

### 元素名稱和屬性必須小寫

XHTML 檔案要求所有的 HTML 元素名稱和屬性名稱都要小寫。因為 XML 本身大小寫意義不同，因此必須區分開來。比如，`<li>` 和 `<LI>` 是完全不同的。

### 要有結束標籤

基於 SGML 的 HTML 4 裡面，允許特定的標籤省略結束標籤；這些元素暗含有結束標記。XHTML 不允許省略結束標記。所有元素（包括在 DTD 中聲明為空的標籤），都必須有結束標籤。在 DTD 中聲明為空的元素可以用結束標籤或者使用空元素速記法（參見空元素 （頁面存檔備份，存於網際網路檔案館））。

　
: 正確的：結束的元素

　
: `<p>這是一個段落。</p><p>這是另一個段落。</p>`

　
: 錯誤的：沒有結束的元素

　
: `<p>這是一個段落。<p>這是另一個段落。`

### 屬性值必須總是使用引號包裹

所有的屬性值都必須使用引號包含，包括那些以數值類型出現的。

　
: 正確的：屬性值使用引號

　
: `<td rowspan="3">`

　
: 錯誤的：屬性值沒有使用引號

　
: `<td rowspan=3>`

### 禁止屬性簡化

XML 不支援屬性簡化，屬性值對必須書寫完整。屬性名，像 compact 和 checked 在沒有指定具體值的情況下，不能夠使用。

　
: 正確的：沒有簡化屬性

　
: `<dl compact="compact">`

　
: 錯誤的：簡化屬性

　
: `<dl compact>`

### 空元素

空元素必須有一個結束標籤，或者用 `/>` 來結束開始標籤。例如，`<br />` 或者 `<hr />`。

**正確的：結束空標籤**
: `<br /><hr />`

**錯誤的：沒有結束空標籤**
: `<br><hr>`

### 屬性值中空白字元的處理

當客戶端在處理屬性時，它們依據的是 XML 的章節 3.3.3

* 祛除字首和字尾的空白字元。
* 將一個或多個空白字元序列對映為單個詞間空格。

### 指令碼和樣式元素

在 XHTML 裡面，指令碼和樣式的元素被聲明為具有**#PCDATA** 內容。因此，`<` 和 `&` 會被認為是標記的開始，另外 `&lt;` 和 `&amp;` 會被 XML 直譯器認為是實體對映被分別解釋成為 `<` 和 `&`。從而將指令碼或者樣式元素包裹在 CDATA 標記的部分以避免這些實體擴充。

在文件物件模型中，CDATA 部分被 XML 直譯器認為是節點，參見文件物件模型章節 1.3 （頁面存檔備份，存於網際網路檔案館）的第一級別推薦 DOM （頁面存檔備份，存於網際網路檔案館）。

一種替代方法就是使用外部的指令碼和樣式檔案。

#### SGML 排斥

SGML 賦予 DTD 作者將特定的元素排斥在某個元素之外的能力。此種限制（被稱為排斥）在 XML 中是不可能的。

例如，HTML 4 的嚴格文件類型描述禁止「**a**」作為子元素巢狀在其他「**a**」的內部。這在 XML 中是不可能檢查出這種限制的。儘管這種限制無法在 DTD 中定義，但是某些特定的元素也不能巢狀使用。關於此類元素和不能巢狀使用的元素概覽可以在標準的元素限制 （頁面存檔備份，存於網際網路檔案館）里找到。

#### 擁有「id」和「name」屬性的元素

HTML 4 定義了 **a, applet, form, frame, iframe, img, and map** 元素的 **name** 屬性。HTML 4 還引入了 **id** 屬性。這兩個屬性被設計用作片段識別碼。

在 XML 裡面，片段識別碼是 **ID** 類型的，而且每個元素只能擁有單一的 **ID** 類型的屬性。所以，在 XHTML 1.0 中 **id** 屬性被定義為 **ID** 類型。為了確保 XHTML 1.0 文件是構建優良的 XML 文件，XHTML 1.0 文件在為以上所列元素定義片段識別碼時必須使用 id 屬性。當 XHTML 文件作為 **text/html** 媒體類型使用時，確保此類錨點的向下相容性資訊參見相容性指南 （頁面存檔備份，存於網際網路檔案館）。

注意：在 XHTML 1.0 中，不贊成此類元素擁有 name 屬性，在 XHTML 的後續版本中將被去掉。

#### 擁有預設值的屬性

有一些屬性在 HTML 4 和 XHTML 中都有一套預設值（比如 **input** 元素的 **type** 屬性）。在 SGML 和 XML 中，這些被稱為_列舉屬性_。在 HTML 4 里這些值的解釋是_不分大小寫_的，所以值 **TEXT** 等同於 **text**。在 XML 里，這些值的解析是_區分大小寫_的，在 XHTML1 中，所有的這些值定義為小寫。

#### 十六進位值的實體對映

SGML 和 XML 都允許使用十六進位的數值來對映字元。在 SGML 里這些對映可以使用 **&#Xnn;**或者 **&#xnn;**。在 XML 文件中，必須使用小寫的方式（比如，**&#xnn;**）。

## XHTML5

XHTML5 並非可擴展 HTML 的後繼語言，而是對 XML 序列化的 HTML5 的稱呼，延續了一部分原本 XHTML 的精神而加入 HTML5，成為 HTML5 規格的一部分。

## 參考文獻

## 外部連結

* XHTML 1.0 可延伸超文本標示語言（第二版） （頁面存檔備份，存於網際網路檔案館）
* XHTML 基礎 （頁面存檔備份，存於網際網路檔案館）
* W3C 驗証服務 （頁面存檔備份，存於網際網路檔案館）
* XHTML 1.1 - 基於模組的 XHTML （頁面存檔備份，存於網際網路檔案館）
* XHTML 2.0（草案） （頁面存檔備份，存於網際網路檔案館）
* 中文的 XHTML 教程
* W3C HTML 首頁 （頁面存檔備份，存於網際網路檔案館）

## 參見

* XML
* HTML
* CSS
* SGML
* Unicode
* Acid2
* W3C 驗証服務