HTML和XHTML常见问答
编者: Steven Pemberton (http://www.cwi.nl/~steven/), W3C/CWI
版本日期: 2004年7月21日
其他相关FAQ:
- XHTML与HTML国际化编写技巧 1.0 (http://www.w3.org/International/geo/html-tech/outline/html-authoring-outline)
- W3C Web国际化FAQ (http://www.w3.org/International/questions.html)
- Web内容可用性 (http://www.w3.org/1999/05/WCAG-REC-fact)
- XForms 1.0 FAQ (http://www.w3.org/MarkUp/Forms/2003/xforms-faq.html)
- W3C FAQ完全列表 (http://www.w3.org/Consortium/W3C-FAQs)
如有对本文档的建议或提议增加新的问题,请发送电子邮件至www-html-editor@w3.org (mailto:www-html-editor@w3.org)(请在邮件主题中加入“FAQ”字样)。
为什么需要XHTML?HTML还不够好吗?
HTML也许是全球最成功的文档标记语言(markup language)。不过,在XML被提出之后,有一个两天的研讨会讨论了是否需要一个基于XML的新版HTML。该研讨会的意见是明确的:即需要一个基于XML的HTML,这样其他XML语言可以包含XHTML片断,而XHTML文档也可以包含其他标记语言的片断。我们还能利用重复设计(redesign)以去除HTML中某些较不整齐的部分并添加一些新需要的功能(比如更好的表单)。
XHTML比HTML有哪些优点?
如果你的文档仅是纯XHTML 1.0的(不包含其他标记语言),那么你还不能体会到较多的不同。但是,随着越来越多XML工具(比如用于文档转换的XSLT)的出现,你将能体会到使用XHTML的优点。比如,XForms使你可以用便捷的方式来编辑XHTML文档(或其他类型的XML文档)。语义Web应用也将得以从XHTML文档获利。
如果你的文档不仅是XHTML 1.0,比如还包含了MathML、SMIL或SVG,那么优点将是立竿见影的:用HTML你是不可能完成这些事的。
我可以把XML声明放到已有的HTML文档顶部吗?我可以把HTML 4.01和XHTML文档混杂在一起吗?
不可以。HTML并不是基于XML格式的。你必须对HTML文档作必要的修改才能使之成为正确的XML文档。
HTML文档转换到XHTML的最容易的方法是什么?
你可以利用HTML Tidy (http://tidy.sourceforge.net/)将HTML文档转换为一个XHTML文档。另外,Amaya (http://www.w3.org/Amaya/)也是一个可以把HTML文档保存为XHTML的浏览器和编辑器。
为什么浏览器对XML的处理如此严格,而对HTML则较容易接受?
这是当然的。HTML浏览器接受任何输入(正确的或不正确的),并试图使之得以正常显示。这种错误纠正使得浏览器程序的编写变得很难,尤其是在所有浏览器都被期望具有相同的显示结果时。这也意味着大量的HTML文档是不正确的,因为它们可以在浏览器中正常显示,所以文档作者未能注意到错误的存在。这使得新的用户代理(user agents)[译注//浏览器是一种用户代理]的编写变为惊人的困难,因为声称符合HTML的文档通常存在着很多错误。
我的HTML文档在我的浏览器中显示正常,为什么我还要关心它是不是正确的HTML?
所有的浏览器都知道应如何去处理正确的HTML,但是对于不正确的HTML文档,浏览器必须要去修正它。而各种浏览器的修复方式是不统一的,这就造成了差异。于是你的文档在不同的浏览器中将会呈现出不同的显示结果和行为方式。由于目前的浏览器种类繁多,而且还在不断增多(除PC机的浏览器以外,还有PDA、手机、电视、打印机甚至电冰箱上的浏览器),因此不可能在每一种浏览器上对你的文档进行测试。如果你使用的是不正确的HTML,并且不能在某种浏览器上正常打开它的话,这将是你的过错;如果你使用的是正确的HTML,而不能正常打开的话,那就是浏览器的bug了。
我在哪里可以验证文档所使用的标记是否正确?
W3C提供了一个对文档进行验证的服务,该服务位于http://validator.w3.org/ (http://validator.w3.org/)。Amaya (http://www.w3.org/Amaya/)是一个浏览器和编辑器,也可用它来确保标记的正确使用。
为什么本文各处都用“用户代理(user agent)”这个词,而不用“浏览器(browser)”?
尽管浏览器确实是HTML和XHTML的重要用户,但是也存在其他读取HTML和XHTML的程序和系统。比如,搜索引擎也读取HTML和XHTML,但是它并不是浏览器。通过使用“用户代理(user agent)”这个词,我们试图提醒人们这里存在着区别。
比如,当你使用Google搜索引擎的时候,你也许会经常在某些搜索结果的下方看到一些诸如“本Web页面使用了框架,而你的浏览器不支持框架。”之类的文字,这无疑将使一些用户不敢恭维并放弃点击那个链接。因为那些网站的作者没有意识到不仅仅是浏览器会读它的网页[译注//Google的搜索结果是由spider读取的,而Google的spider作为一种用户代理是不支持框架的],他们应在<noframes>中写入更恰当的文字,以至于不会显得如此尴尬。
为什么在XHTML里我必须使用命名空间?
在HTML时代的早期,不同的组织和公司随意地在HTML中添加新的元素和属性,这成为导致由不可互操作的各种HTML版本造成混乱的潜在因素。XML(其中的X代表Extensible,即可扩展的)允许人们使用来自不同语言的元素和属性,但是为了使浏览器或其他用户代理可以知道哪个元素归属哪个语言,你必须对此加以说明。而命名空间声明(namespace declarations)就是用于这一目的的。
为什么允许以text/html发送XHTML 1.0文档?
XHTML是一种XML格式。这表明,严格地说应该用一个XML相关的媒体类型(meida type)(如application/xhtml+xml、application/xml或text/xml)来发送XHTML。不过XHTML 1.0是经过精心设计的,XHTML文档只要在制作时略加注意便可在传统的HTML用户代理上工作。只需你遵守一些简单的规则,你就可以使许多XHTML 1.0文档能够在传统的浏览器上工作。可是,传统的浏览器仅能理解text/html媒体类型,于是你必须使用text/html来发送XHTML 1.0文档。不过需要注意的是,以text/html发送XHTML文档意味着那些浏览器将把它们作为HTML文档,而不是作为XHTML文档来处理。
哪些浏览器可以支持application/xhtml+xml媒体类型?
我们所知道的支持application/xhtml+xml的浏览器包括:所有基于Mozilla的浏览器(如Mozilla、Netscape 5或更高版本、Galeon和Firefox)、Opera、Amaya、Camino、Chimera、DocZilla、iCab、Safari,以及所有接受WAP2的手机浏览器。实际上,任何最新的浏览器都将支持application/xhtml+xml媒体类型。大多数浏览器也接受以application/xml发送的XHTML文档。更多细节请参见XHTML媒体类型测试 (http://www.w3.org/People/mimasa/test/xhtml/media-types/results)。
微软的IE浏览器支持application/xhtml+xml媒体类型吗?
不支持。不过有一个技巧可以让你把XHTML 1.0文档以application/xml提供给IE浏览器。
将下列粗体部分列于你的文档头部:
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="copy.xsl"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
这里的copy.xsl是一个包含下列内容的文件:
<stylesheet version="1.0"
xmlns="http://www.w3.org/1999/XSL/Transform">
<template match="/">
<copy-of select="."/>
</template>
</stylesheet>
注意:该文件必须与引用它的文档存在于同一目录下。
尽管你把该文档作为XML提供给浏览器,并能够作为XML被解析,但是浏览器认为它收到的是text/html,因此你的XHTML 1.0文档必须遵守一些规则以被传统浏览器所接受。
CSS有许多特别的规则仅应用于HTML。这些规则也应用于XHTML吗?
不。仅应用于HTML的CSS规则将只会应用于以text/html发送的文档。
document.write可以在XHTML中用吗?
不。根据XML的定义方式,不允许使用任何这类手法:即当解析器还在解析标记时,用脚本来生成标记。
你仍可以取得相同的效果,只是你必须用DOM来增加或删除元素。
为什么不允许以text/html发送XHTML 1.1文档?
XHTML 1.1是纯XML的,并旨在仅作为XML。它不能确保被发送到传统浏览器上。因此XHTML 1.1文档必须以一个XML相关的媒体类型(比如application/xhtml+xml)来发送。
为什么XHTML 1.1中去掉了target属性?
不是。XHTML 1.0存在三种版本:strict(严格式)、transitional(过渡式)和frameset(框架式)。这三种版本都尽量地在XML允许范围内保持与HTML 4.01接近。XHTML 1.1是对XHTML 1.0 strict的更新,而target属性没有包含在任何HTML strict的版本中。XHTML 1.1没有对XHTML 1.0的其他两种版本(transitional和frameset)进行更新。如果你要使用target属性的话,那么请使用XHTML 1.0 transitional。
什么是XHTML模块化的使用?
XHTML模块化(XHTML Modularization)不是针对常规XHTML用户的,而是针对基于XHTML的语言的设计者的。已经注意到,各个公司和组织在设计他们自己版本的HTML和XHTML时有一种趋势,即这些HTML和XHTML常常不能在基本程度上互操作。XHTML模块化将XHTML划分为许多个模块(module),在定义一个新的语言时,这些模块可被各自地选取;这样,任何使用table的基于XHTML的语言都能确保使用同样的table的定义,而不是各种不同版本的table。模块化也明确了哪里可以插入新元素(element),哪里不可以。
为什么需要XHTML 2?XHTML 1还不够好吗?
虽然HTML和XHTML已经做得很不错,但是仍有许多可改进的方面。已经受到特别关注的方面包括:更优结构化的可能性、去除与XML重复的特征、易用性(usability)、可用性(accessibility)、国际化(internationalization)、设备独立性、更好的表单(form)以及减少脚本书写量等。
在XHTML 2中,<img>将会被<object>所取代吗?
不。虽然<img>在XHTML2中会被取代,但不是被<object>而是被其他标签所取代(不过如果你愿意的话,也可以使用<object>)。
<img>的设计在HTML中存在许多问题:
- 没有备选(fallback)[译注//即当用户代理不能处理某种类型的图像时,可将备选内容作为显示结果]的可能性,因此如果你使用了PNG图像,而浏览器不支持该类型图像的话,那么浏览器只能用img元素的alt文本作为显示结果。这一状况导致了在许多方面强于GIF和JPG图像的PNG图像不能被采用,因为人们总会采用最广为接受的格式以确保图像能被正常显示。
- 不能对alt文本作标记,因此如果要使用alt文本的话,你只能得到纯文本。
- 虽然可以在img元素中使用longdesc属性引用一个对图像作描述的链接,以帮助不能看到图片的人,但是该属性很少被实际使用。
在XHTML 2中是这样做的:所有图像都与某个元素的内容片断相等价。XHTML 2允许在任何元素(element)上使用src属性来引用一个图像。如果该图像可用[译注//比如可以获得相应的图片文件],并且浏览器可以处理它,那么就使用该图像,否则就使用该元素的内容。下面是一个例子:
<p src="map.png">Exit from the station, turn left,
go straight on to <strong>High Street</strong>,
and turn right</p>
这样的优点是,当图像由于某些原因不可用时(比如由于网络故障),或者浏览器不能显示该类型的图像时,你的文档仍然有友好的显示结果。如果你要提供多种类型的图像,你可以这样做:
<p src="map.png"><span src="map.gif">Exit from station...</span></p>
其实更好的方法是使用内容协商,如果你的服务器支持的话(大多数服务器是支持的):
<p src="map">Exit from station...</p>
这样服务器将与浏览器协商使用一种浏览器所支持的图像类型,并提供该类型的图像给浏览器。如果没有可用的图像,那么浏览器将使用元素的内容。这样做的另一个优点是,你可以稍后在服务器上增加更多图片类型,而不必对网页作修改。
为什么XHTML 2不用XLink?
XLink和XHTML对链接有不同的需求,而且它们在需求间的差异是不可调和的。
为什么XHTML 2不是向后兼容的?
XHTML不是向后兼容的,但这只是与早前版本的HTML在向后兼容的方式上不同而已。
由于更早的HTML版本是一些特定用途的语言,因此必然要保证在某种程度上与新版本保持向后兼容性,以确保新文档在老的浏览器上仍然可以显示。比如,<meta>元素把信息放到属性而不是元素内容里正是由于这个原因。
但是,由于有了XML和样式表,因此不再需要这种严格的元素方面的向后兼容性了。因为一个基于XML的浏览器,在任何时候都意味着当前95%以上的浏览器不必更新即可处理新的标记语言。许多XHTML 2已能够在现有的浏览器中运行 (http://w3future.com/weblog/gems/xhtml2.xml),而这些浏览器并不是为了接受XHTML 2而事先设计的。虽然大部分XHTML 2在目前浏览器上可以工作,但也有部分特性还不行:在表单(form)和表格(table)被加入HTML时,人们必须要等待新版本的浏览器;同样地,XHTML 2的一些部分,比如XForms和XML Events还需要能够理解这些功能的用户代理。
为什么在XHTML中所有元素的xml:space属性都被设定为“preserve”?我不想在输出中看到多余的空格怎么办?
xml:space属性是关于“输入(input)”的:也就是说,它控制DOM(即浏览器内部的文档内部版本)中是否将有空格;它没有对屏幕上将出现的东西作任何陈述。输出空白是由CSS属性“whitespace”控制的。将它设为“pre”,DOM中的空格将在输出中被保留;将它设为“normal”,空白将被压缩(CSS3将有更多属性对此进行更强的控制)。
这就是为什么在XHTML2中所有元素都被设为xml:space=“preserve”的原因。
Copyright © 2004 W3C ® (MIT, ERCIM, Keio (http://www.keio.ac.jp/)), All Rights Reserved. W3C liability (http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer), trademark (http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks), document use and software licensing rules apply. Your interactions with this site are in accordance with our public (http://www.w3.org/Consortium/Legal/privacy-statement#Public) and Member (http://www.w3.org/Consortium/Legal/privacy-statement#Members) privacy statements.