XHTML

可擴展超文本標記語言（eXtensible HyperText Markup Language，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」改編，但不包括被棄用的元素。其文件類型描述為：

```xml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
```

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

```xml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
```

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

```xml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
```

- XHTML 1.1。其文件類型描述為：

```xml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
```

- XHTML Basic。其文件類型描述為：

```xml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">
```

另外，在Microsoft Internet Explorer 5.0所新增的`&lt;ruby&gt;`小字註解標籤，在XHTML 1.1得到支援（參看旁註標記）。

而第二版的XHTML 1.0於2002年8月成為W3C推薦的文件類型。

2.0止於草案。

XHTML5不需要DTD。

## 有效的XHTML文件

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

## 語法

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

## 和HTML 4的區別

（翻譯自 W3C XHTML說明）這部分涉及內容廣泛。

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

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

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

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

正確：元素嵌套

`&lt;p&gt;&lt;em&gt;這是一個要強調的段落。&lt;/em&gt;&lt;/p&gt;`

錯誤：元素交叉

`&lt;em&gt;&lt;p&gt;這是一個要強調的段落。&lt;/em&gt;&lt;/p&gt;`

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

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

### 要有結束標籤

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

正確的：結束的元素

`&lt;p&gt;這是一個段落。&lt;/p&gt;&lt;p&gt;這是另一個段落。&lt;/p&gt;`

錯誤的：沒有結束的元素

`&lt;p&gt;這是一個段落。&lt;p&gt;這是另一個段落。`

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

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

正確的：屬性值使用引號

`&lt;td rowspan="3"&gt;`

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

`&lt;td rowspan=3&gt;`

### 禁止屬性簡化

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

正確的：沒有簡化屬性

`&lt;dl compact="compact"&gt;`

錯誤的：簡化屬性

`&lt;dl compact&gt;`

### 空元素

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

正確的：結束空標籤:`&lt;br /&gt;&lt;hr /&gt;`

錯誤的：沒有結束空標籤:`&lt;br&gt;&lt;hr&gt;`

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

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

- 祛除前綴和後綴的空白字符。
- 將一個或多個空白字符序列映射為單個詞間空格。

### 腳本和樣式元素

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

```xml
<script type="text/javascript">
<![CDATA[
 ...沒有轉義處理的內容...
]]>
</script>
```

在文檔對象模型中，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首頁

## 基本資料

- 擴展名：.xhtml, .xht, .html, .htm
- mime：application/xhtml+xml
- 所有者：World Wide Web Consortium
- 類型：標記語言
- 域：
- 擴展自：XML, HTML
- 標準： 1.0 (Recommendation)、 1.1 (Recommendation)、 1.1 SE (Working Draft)、 5 (Working Draft)、 2.0 (Working Draft)