- MIME[1]类型(MIME Types)
- 解析(Parsing)
- 语法(Syntax)
- 标记(Markup)
- 字符编码(Character Encoding)
- 脚本(Scripts)
- 样式表(Stylesheets)
请注意以下信息是基于(X)HTML5的当前规范,某些技术上问题并不适用于HTML的早先版本。
虽然HTML和XHTML看起来在语法上类似,但在很多方面显著的不同。
注:由于当前的WHATWG[2]文档是一个草案,这个部分需要跟随一个变化的对象。标记@@@的不同是从理论上可以被改变且不影响向后兼容的不同。
MIME类型(MIME Types)
- XHTML必须以XML MIME类型来提供,例如application/xml 或 application/xhtml+xml。
- HTML必须以text/html来提供。
MIME类型决定了使用文件的类型。如果尝试使用text/html来发送XHTML,你实际上仅使用了HTML,可能有语法错误。
技术上,依据规范,XHTML1.0被允许作为text/html来发送。但是正是由于上面的原因,这样的一个文件被认为是HTML文件而不是XHTML文件
解析(Parsing)
XHTML用XML解析请求。HTML用它自己定义的更接近当前浏览器实际处理HTML的方式。
- 在XHTML中,良构性(well-formedness)错误是致命的。在HTML中,错误处理规则更加优雅。良构性错误在HTML也是语法错误,包括以下:
- 未编码的和符号(&替代&)和小于符号(<替代<)(这并不应用于CDATA)。(注:在HTML中,未编码的和符号在一些情况下是被允许的。)
- 注释包含额外的连接字符或以一个连接字符结尾。例如:
<!--语法--错误--> or <!--语法错误--->
- 不匹配结束标签。(不适用于可选标签元素)
- 不闭合标签。
- 非法字符出现在属性名称前或中。
- 文件结束(EOF)意外发生。
- 非法的字符出现在DOCTYPE名前。
- 丢失DOCTYPE名。
- 在DOCTYPE中PUBLIC标识符没有SYSTEM标识符。(注:在HTML5中包含这些中的任何一个是语法错误,在XML中允许唯一的SYSTEM标识符出现在它自己中。)
- 有属性的结束标签。
- 非法结束标签。(在HTML中,一个非法的</br>和</p>会导致产生隐含在它之前的开始标签。)
- 内部子集在XML中是允许的,在HTML中是无意义的(且被禁止)
- 在一些情况下,HTML中的内部子集最终部分内联呈现。
- 当符号序列“]]>”在内容中不标记一个CDATA段的结束时,在XHTML中是一个良构性错误,但在HTML中是有效的。
- <![CDATA[...]]>,在XHTML中是一个CDATA片段,在HTML中是一个伪造的注释。
- <?foo …?>,在XHTML中是一个处理指令,在HTML中是一个伪造的注释。
- 在HTML中,用于空元素语法的尾部斜线在非空(non-void)元素(见下)中会有解析错误,但在所有情况下都被忽略。
- 在HTML中,script和style元素作为CDATA解析。(注:这个CDATA的定义不同于XML中的。)在XML中,它们作为普通元素解析(这意味着注释被当着真正的注释,看起来像起始标签的就是起始标签)。
- 在HTML中,title和textarea元素作为RCDATA被解析。(RCDATA定义不同于SGML中的,也不是XML的RCDATA.)
- 在HTML中,如果脚本执行(scripting)是可用,noscript元素作为CDATA被解析。如果脚本执行是不可用的,它作为PCDATA被解析。在XHTML中,这个元素是没有作用的,当脚本执行不可用时,不能真正被用于阻止内容将要呈现。
- 在HTML中,iframe,noembed和noframes作为CDATA解析。在XHTML中作为普通元素被解析,因此不能阻止内容被使用。
- 在XHTML中属性值的空格(white space)符被标准化为空白[3]。
- 在HTML中,可选标签的元素在特定情况下被隐藏。
- 在HTML中,在body中出现的带标签的title元素被转移到head中。在XHTML中,它停在指定它的地方。
- 在HTML中,脱离上下文(context)出现的特定元素的标签被忽略。包括:caption,col,colgroup,frame, frameset,head,option,optgroup,tbody,td,tfoot,th,thead,tr。
- plaintext在HTML中有一个特别的解析请求。(无论如何,它都是被禁止的。)
- 这并不是全部的在HTML中发生的边界状态和错误条件。
语法(Syntax)
- 在HTML中,doctype是必须的。在XHTML中是可选的。
- 在XHTML中,标签名和属性名是大小写敏感的。在HTML中,它们是不敏感的。
- 在XHTML中,非空元素必须有一个开始标签和一个结束标签。在HTML中,某些元素允许省略一个或两个标签。
- html (两个)
- head (两个)
- body(两个)
- li (结束标签)
- dt (结束标签)
- dd (结束标签)
- p (结束标签)
- colgroup (两个)
- thead (结束标签)
- tbody(两个)
- tfoot (结束标签)
- tr (结束标签)
- td (结束标签)
- th (结束标签)
- 在XHTML中,空元素可以用空元素语法(<br />)或一个结束标签紧跟在开始标签的后面(<br></br>)。在HTML中,空元素(empty elements)语法(尾部斜线)允许出现在空元素(void elements)上[4],但是禁止在非空元素上。无论如何,它没有任何意义可言,可以省略。对于空元素,结束标签是禁止的。
- base, link, meta, hr, br, img, embed, param, area, col 和 input。
- 注:在解析请求时,下面的元素被当作空元素对待,因为它们是过时和不标准的。尾部斜线是不允许的:basefont, bgsound, spacer,wbr(在任何方式下这些元素都是不允许的,所以它们没有太多不同)。
- HTML允许属性最简化(minimisation),比如省略这个值,而XHTML不允许。
- HTML允许使用没有引号的属性值,而XHTML不允许。
- XHTML允许使用CDATA片段,而HTML不允许。
- XHTML允许处理指令,而HTML不允许。
- 在HTML中,所有实体引用(entity references)都是预定义的,不请求一个文档类型定义(DTD[5])。但是由于XHTML5没有DTD,实体引用不能用在XHTML中(包括5中预定义的实体:&amp;,&lt;,&gt;,&quot; 和&apos;)。
- 可以用自己的验证解释器提供自己的DTD,但是浏览器不能使用这个验证解析器而将无法读取DTD。
- 一套合法的unicode字符集在XML1.0中的限制远超在HTML中。
- XHTML允许命名空间前缀,但是HTML禁止。
标记(Markup)
- 在XHTML中,命名空间声明(xmlns属性)是必须的。在HTML中的html元素也允许xmlns属性出现,其值是”http://www.w3.org/1999/xhtml”。
- <html xmlns=”http://www.w3.org/1999/xhtml”>
- 在HTML中,xmlns没有绝对作用。它基本上是一个护身符。它被允许仅仅是为了从XHTML移植过来更容易。当被HTML解析器解析时,这个属性最终处于无效的(null)命名空间中。
- 在XML(和XML命名空间理解的解析器)中,xmlns属性是其命名空间声明机制的一部分,一个元素实际上在无效的命名空间中是不能有xmlns属性的。当DOM执行时,这个属性最终在”http://www.w3.org/2000/xmlns/”命名空间中。
- XHTML允许使用非XHTML元素和属性(在不同的命名空间),HTML不允许。
- XHTML用xml:lang属性,HTML用lang属性代替。
- XML ID引入xml:id,能用在XHTML中,但在HTML中没有作用。
- 在HTML中,noscript能被使用,在XHTML中,它是禁止的。
- HTML用base元素,XHTML用xml:base代替。
- 在XHTML中,p元素也许包含结构化的内联级(inline level)元素,包括blockquote, dl, menu, ol, ul, pre 和 table。在HTML序列化中,由于向后兼容的限制,这是不可能的(虽然它或许可以通过DOM操作实现)。
- 在XHTML中,table元素或许包含子tr元素。在HTML序列化中,由于向后兼容的限制,这是不可能的(虽然它或许可以通过DOM操作实现)。
字符编码(Character Encoding)
- 在XHTML中,XML声明被用于指定的字符编码。在HTML中,禁止XML声明。
- 在HTML中,带有一个charset属性的meta可以用于代替。在XHTML中,如果有包含它,它是被禁止且忽略的。
- XHMTL的默认编码是依据XML规则,UTF-8或UTF-16。在HTML中如果没有声明编码,它应该决定执行一个特别的启发式的或退回到一个默认的值。(规范中本章节还未完成)
脚本(Scripts)
- document.write()和document.writeln()不能用在XHTML中,但能用在HTML中。
- 在XHTML中,通过innerHTML属性获取的字符串必须是一个良构的XML片段。
- DOM APIs在XHTML中是大小写敏感的,但是一些在HTML中是不敏感的。(不适用于那些不在HTML命名空间的元素。)
- Element.tagName, Node.nodeName,和 Node.localName 返回是大写的值。
- Document.createElement()是大小写不敏感的(规范写法是小写)。
- Element.setAttributeNode()将会把属性名改成小写。
- Element.setAttribute()是大小写不敏感的(规范写法是小写)。
- Document.getElementsByTagName()和 Element.getElementsByTagName()是大小写不敏感的。
- Document.renameNode()。如果新的命名空间是HTML命名空间,在重命名执行之前新的合格的名字必须是小写。
- 在HTML中,Document.createElement()在HTML命名空间下创建一个元素。在XML(包括XHTML),这个被DOM2和DOM3定义的命名空间是空的。
- 在XHTML中,浏览器在这个领域缺乏通用性。在Firefox,这个命名空间依赖于MIME类型。在Opera它依赖于根元素,而在Safari,它一直是无效的。
样式表(Stylesheets)
- 用于CSS中的选择器(selectors)匹配在XHTML中是大小写敏感的,在HTML中大小写不敏感的。
- 在HTML中在画布上渲染背景,CSS请求body元素的特殊处理,但不适用于XHTML。
原文: Differences Between HTML and XHTML
- [1] MIME : Multipurpose Internet Mail Extensions是Internet的传输标准,它提供Web浏览器一种检视多种档案格式的方式。
- [2] WHATWG:Web Hypertext Application Technology Working Group网页超文本技术工作小组。
- [3] XML1.0对属性值进行了标准化。对于空格字符(#x20,#xD,#xA,#x9)加入了空白字符(#x20)变成了标准化的值。
- [4] void elements是empty elements的新名字
- [5] DTD(Document Type Definition):文档类型定义
|