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
- 类型：标记语言
- 域：

<image>

- 扩展自：XML, HTML
- 标准： 1.0 (Recommendation)、 1.1 (Recommendation)、 1.1 SE (Working Draft)、 5 (Working Draft)、 2.0 (Working Draft)