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,无论页面上是否有任何错误,因此该页面会呈现。