HTML与XHTML的区别

虽说XHTML向下兼容HTML4.01,但因为XHTML又应用了XML规则,所以XHTML在应用方面还是又几个比HTML4.01更严谨或不同之处。

1. XHTML文档必须具有良好完整的排版(well-formed)
编排良好性(Well-formedness)是XML引入的一个新概念。从本质上说,元素必须有结束标签,或者必须以特殊方式书写,而且元素必须嵌套。
尽管SGML规定重叠(overlapping)是非法的,但现有的浏览器普遍允许HTML重叠。

正确:嵌套元素(nested elements)

<p>学习<em>XHTML教程</em></p>

不正确:层叠元素(overlapping elements)×

<p>学习<em>XHTML教程</p></em>

2. 元素和属性名必须小写
对于所有HTML元素和属性名,XHTML文档必须使用小写。 因为XML是大小写敏感的。如 <li> 和 <LI> 是不同的标签。

3. 对非空元素,必须使用结束标签
在基于SGML的HTML4中的一些隐含结束意义的元素允许忽略结束标签。XML不允许忽略结束标签。除了在DTD中被声明为空的元素,所有元素必须有结束标签。
正确:结束的元素(terminated elements)

<p>学习XHTML教程。</p><p>学习CSS教程。</p>

不正确:未结束的元素(unterminated elements)×

<p>学习XHTML教程。<p>学习CSS教程。

4. 属性值必须在引号中
所有的属性值必须在引号中,即使是数字形式的属性值

正确:在引号中的属性值(quoted attribute values)

<table rows="3">

不正确:不在引号中的属性值(unquoted attribute values)×
<table rows=3>

5. 属性最小化
XML不支持属性最小化。属性-属性值必须完整成对的写出。像disabled,checked这样的属性名不能在不指定属性值的情况下出现。
正确:非最小化属性(unminimized attributes)

<input checked="checked">
不正确:最小化属性(minimized attributes)×
<input checked>

6. 空元素
空元素必须有结束标签,或者起始标签必须以/>结束。例如,<br/>或<hr></hr>。参看W3C的HTML兼容性指导HTML Compatibility Guidelines中的信息,以保证向后兼容HTML 4用户代理程序。
正确:结束的空元素(terminated empty elements)

<br/><hr/>
错误:未结束的空标签(unterminated empty elements)×
<br><hr>

7. 属性值中的空白字符处理
用户代理处理属性值时将根据XML的下面方法操作:

8. Script and Style 元素
XHTML中,script和style元素被声明为#PCDATA内容形式,因此,<和&被看作是标识的开始,&lt;和&amp;等HTML实体将被XML处理器看作为实体引用而分别被认为是<和&。将script和style元素的内容隐蔽在CDATA标记中避免了这些实体的扩张,也就是使用了XML的CDATA section形式:

<![CDATA[[...]]>

因此,以script元素为例,应使用下列形式:

<script type="text/javascript">
<![CDATA[
... unescaped script content ...
]]>

</script>

CDATA部分被XML处理器识别,表现为文档对象模型中的一个结点。参看Section 1.3 的DOM LEVEL 1推荐标准[DOM].

在需要以text/html发送的文件中,为了能在不处理CDATA部分的浏览器中隐藏,CDATA部分的起始和结束标签需要标识成注释:

<script type="text/javascript">
//<![CDATA[
... unescaped script content ...
//]]>
</script>

<style type="text/css">

/*<![CDATA[*/
... unescaped stylesheet content ...
/*]]>*/

</style>

虽然在XHTML中用XML的CDATA section形式,可以在script和style元素中使用<和&,但这对于大多数的当前浏览器来说,可能都有问题,因为它们无法解析CDATA,最聪明和最安全的方法就是把所有的CSS和JavaScript都移到外部文件中:

<script src="js.js" type="text/javascript"></script>

9. SGML排斥
SGML给作者的DTD可以指定在一个元素内部禁止出现的元素。这样的禁止(或常排斥)在XML中是不可能的。
例如,严格的HTML 4 DTD“禁止”任何层次的“a”元素对另一“a”元素的嵌套。在XML中无法写出这些的“禁止”。虽然这些禁止不能被定义在DTD中,但是一些元素不应该被嵌套。对不能被嵌套的元素Element Prohibitions的总结:

  • a元素不能包含另外一个a元素;
  • pre元素不能包含img、object、big、small、sub及sup等元素;
  • button元素不能包含input、select、textarea、label、button、form、fieldset、iframe、isindex等元素;
  • label元素不能包含label元素;
  • form元素不能包含form元素。
  • 10. 具有“id”和“name”属性的元素
    HTML4定义了name属性的元素有a、applet、form、frame、iframe、img and map。HTML4还引入了id属性。这两个属性都是被设计用为片段标识符。

    在XML中,片段标识符是ID,每个元素只能有一个ID类型的属性。因此,在XHTML1.0中,id属性被定义为ID类型。为保证XHTML1.0文档是结构良好(well-structured)的XML文档,在定义一个片段标识符时,XHTML文档必须使用id属性,即使是对那些以前用name属性的元素,参看 HTML Compatibility Guidelines ,确保XHTML文档以text/html媒体类型使用时,这些"锚(anchors)"能向后兼容。

    注意,在XHTML 1.0中,name属性是不赞成使用的,在以后的XHTML版本中将被删除。

    11. 具有预定义值的属性
    HTML 4和XHTML都有一些属性值为固定几个值的属性,比如input元素的type属性。在SGML和XML中,它们被称为列举属性。在HTML 4中,这些属性的属性值是不区分的小写的,所以type="TEXT"和type="text"都是可以的。而在XML中这些值是区分大小写的,在XHTML中它们也要小写。

    12. 实体参考的十六进制值
    SGML和XML都允许字符参考使用十六进制值, SGML中这些参考可以用“&#Xnn;”或“&#xnn;”表示;但在XML中必须小写,即“&#xnn;”

    总结一下:

  • 标签不能重叠,可以嵌套
  • 标签与属性都要小写
  • 标签都要有始有终,要么以</p>形式结束,要么以<br />形式结束
  • 每个属性都要有属性值,并且属性值要在双引号中
  • 用id代替name
  • 参阅:
    什么是HTML

    W3C的XHTML与HTML常见问题http://www.w3.org/MarkUp/2004/xhtml-faq
    在W3C(www.w3.org)网站上校验XHTML的正确性http://validator.w3.org/
    W3C XHTML1.0首页
    W3C XHTML2.0首页