HTML5文档类型定义在哪里?

73

“旧”的HTML/XHTML标准都有定义DTD(文档类型定义):

HTML 4.01 http://www.w3.org/TR/html401/sgml/dtd.html
XHTML 1.0 http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict

这些DTD指定了嵌套元素的规则 - “哪些类型的元素可以出现在哪些类型的元素中”。 我曾经为XHTML 1.0制作过一个图表(抱歉,我不再拥有那个资源)

我想使用新版本更新该图表,其中还包括新的HTML5元素。但是,似乎没有HTML5 DTD。 嵌套规则似乎是由HTML5中定义的各种内容模型定义的。

那么,没有DTD,对吗?

后续问题: HTML5为什么没有DTD?DTD是定义所有不同类型元素的嵌套规则的好方法。为什么他们不包含这样的东西?

更新: 我找到了这个: http://www.w3.org/TR/html5/dom.html#kinds-of-content 我想,这是最接近拥有DTD的东西。

更新:Visual Studio团队为XHTML5制作了XML模式。我猜这回答了我的问题:链接

链接http://vidasp.net...将我重定向到此处 - RubenGeert
@pythonforspss.org 是的。我不再拥有那个域名了。我已经删除了那个链接。谢谢你告诉我。 - Šime Vidas
同样适用于XSD:https://dev59.com/questions/Pm035IYBdhLWcg3wE71s - Ciro Santilli OurBigBook.com
这不是一个答案,但如果你仍然对这个问题感兴趣,你可能会对这个链接感兴趣:https://github.com/unsoup/validator - Graham Hannington
请注意,“HTML Living Standard”在传统意义上并不是一个“标准”;更有用的理解方式可能是将其视为一种众包文档,描述了“主要”的浏览器引擎在当前时刻通常支持的内容。 - Jim Grisham
5个回答

68

HTML5没有DTD。在讨论XHTML序列化时,HTML5 RC明确表示了这一点,这显然也适用于HTML序列化。

HTML5的设计者认为DTD在表达能力方面太过有限,因此HTML5验证器(基本上是http://validator.nu和其副本http://validator.w3.org/nu/的HTML5模式)使用模式和特定检查,而不是基于DTD的验证。

此外,HTML5的设计使得编写DTD变得不可能。例如,没有SGML方法可以捕获HTML5规则,即任何以“data-”开头并符合某些通用规则的属性名称都是有效的。在SGML中,需要单独列出属性,因此DTD需要是无限的。

可以设计与 HTML5 对应的 DTD,但需要省略一些内容并加入一些额外的规则,但它们实际上并不是 HTML5 的 DTD。我的尝试结果不太理想:限制太多、操作太繁琐,而且DTD需要非常宽容,以至于许多语法错误无法被捕获。


2
DTD是SGML和XML的东西。 XML DTD在表达能力方面甚至比SGML DTD更加有限; 在这个领域,XML也是SGML的简化。 - Jukka K. Korpela
@JukkaK.Korpela - 不确定您是否仍然关心此事,但是您在伪HTML5 DTD中的<colgroup>条目似乎明显不正确。唯一允许的子元素是<col>,而这似乎未被包括在内,而无效的子元素通过%phrase列出。 - pgoetz
2
这一切都是如此不幸;有些事情根本没有意义,比如在body标签内使用head标签,或者在span标签内使用div标签。因此,应该有一种方法来验证您的HTML语法,就像JavaScript在您犯逻辑错误时会抛出逻辑错误一样。 - blagus
@blagus 我同意;也许你说得很对。你至少可以用JavaScript编写一个验证器。 - That Realty Programmer Guy

24

5
DTD来源于HTML的SGML根源。HTML5不再基于SGML,因此没有DTD。 - Adam
1
@Adam 但是XHTML5呢?它是XML的一个应用,所以应该有DTD或XML Schema,对吧? - Šime Vidas
2
@Šime Vidas 挺好的观点。我不知道 XHTML5。你说得对,应该能够创建一个。我进行了快速搜索,看看是否有人制作了一个,我找到了 http://johndyer.name/post/HTML5-XHTML5-Validation-Schema-for-Visual-Studio-2008.aspx 和 HTML5 实体 http://www.w3.org/2003/entities/2007/w3centities-f.ent。 - Adam
1
@Adam 抱歉回复这个旧帖子,但如果我省略DTD,那么浏览器如何知道我希望它如何解释接收到的HTML呢? - RubenGeert
2
@pythonforspss.org 浏览器从文档类型(doctype)中知道这个文档是HTML5。现代浏览器知道如何解释HTML5。 - Adam
显示剩余3条评论

8
我已经为我的PHP XML项目创建了一个HTML5 DTD。它不太美观,但可以与格式良好的XHTML5(即以XML表示的HTML5)一起使用。
你可以从我的Bitbucket账户这里获取它:

https://bitbucket.org/kashbridge/dtd/overview

享受!


Jukka K. Korpela提供的DTD已经在被接受的答案@Hibou57中被他本人提到过。 - Palec
在这个相关问题的答案中提供了另一个手动编写的HTML5 DTD。 - raner
同一问题的另一个答案也提供了可能的解决方案,尽管并不完全清楚那个DTD是否真正开源。 - raner
你可以在XML中构建一个有限的HTML5 DTD,但它不能完全验证模式(特别是HTML5的“data-”属性,可以自由定制),除非添加一个额外的XML XSD;使用SGML解析器进行DTD时也存在复杂的安全问题,即使在XML中也是如此;DTD太过有限(并且没有标准化的扩展SGML规则允许定义“data-”属性);同时DTD不允许限制许多HTML值的值,这意味着你需要一个额外的HTML5验证器,但这在HTML4中已经是这样的情况了。 - verdy_p

3

来自sgmljs.net的Certain Marcus创建并分析了一个HTML 5.1的SGML DTD,并在XML-DEV邮件列表中开启了一篇讨论帖以进行审查和讨论。目前讨论主要围绕实体定义展开。

我刚刚完成了对W3C的HTML 5.1推荐的分析http://sgmljs.net/docs/html5.html(从标记语言而非Web开发的角度),并将其以初步的SGML DTD形式发布在此处,以及一份详尽的分析文本。 我知道WHATWG和W3C已经很长时间没有使用SGML(在大多数与Web相关的规范工作中也没有使用XML),他们将其视为遗留技术,并在规范文本和其他地方表现出一种自以为是的态度。但正如HTML5的语法分析所显示的那样,他们基本上完全放弃了任何形式的正式方法(并且至少在分析中讨论的两个缺陷中可以看出这一点)。 没有什么官方消息,但也许这个举措会得到关注,或者至少作为非官方资源找到其用户。

我认为该倡议的信息很有趣,@cpburnz(和其他评论者)的回答确实不仅仅是一个链接。此Q&A中的另一个答案内容非常类似 - 只有一个链接和另一个非官方HTML 5 DTD的简短描述。它获得了6个赞成票和没有反对票。 我从xml-dev列表中包含了相关信息,我现在看不到更好的回答这个问题的方式。 - Palec
请注意,“HTML Living Standard”在传统意义上并不是一个“标准”;更有用的理解方式可能是将其视为一种众包文档,描述了“主要”的浏览器引擎在任何时刻通常支持的内容。 - Jim Grisham
可能可以添加对DTD的有限支持,仅用于实体定义;然而,在具有与SGML相同的“自由规则”的文档中定义实体将导致严重的安全问题(在SGML中定义的实体可以嵌入任何内容,没有任何限制和验证形式)。如果HTML5以后扩展允许定义更大的实体集合,肯定不会使用任何类似SGML的DTD,并且会施加限制(例如,只允许为单个字形簇或简单的组合序列定义它们,使用受限的Unicode代码点集合)。 - verdy_p
所以目前来看,仍然不可能普遍定义希伯来文、阿拉伯文或中文所常需的新实体,对于大多数其他非拉丁字母、希腊字母、西里尔字母以及数学符号的脚本而言也是如此;对于婆罗米文字母用户,抱歉,HTML5中不支持它们的字母实体,同样地,CJK用户也无法在HTML5中使用表意空格、注音符号以及假名字母作为实体(但可以使用NCR代替)。也许以后的某个“HTML6”版本将引入一种新的方法来定义(和验证!)更大的实体集合(但不使用旧的危险的SGML DTD)。 - verdy_p

0

我认为他们已经放弃了旧的DTD,现在我们只需使用以下内容开始HTML页面:<!DOCTYPE HTML>

也许W3C最终会推出新的DTD。


这种情况发生的可能性非常小。DTD(文档类型定义)非常危险且无法验证。相反,W3C可能会引入一种更安全的系统来定义一些行为良好的实体集合,例如基于基本的JSON语法和严格的验证规则(在我看来,他们可能首先限制每个实体只能有一个组合序列,可能还可以通过变异选择器进行扩展:组合序列和变异序列在Unicode标准中有非常严格的定义;支持通用的字形簇将会更加困难和棘手:例如,看看表情符号序列以及复杂字形簇的Opentype规则!)。 - verdy_p
如果W3C标准化了比旧的DTD更好的HTML系统,应该将其添加到XML的支持中,并且可能还会在新的更安全的XML1版本中使用,禁止使用DTD并用更安全的系统替换它(仅使用XML中的XSD系统显然是不够的)。一个更安全和高效的系统应该基于基于JSON的“数据语言”,具有严格的验证规则来定义自己的数据模式;这将成为未来“HTML6”和“XML2”标准的基础,同时允许定义一个高效且安全的“XHTML6”。再见SGML! - verdy_p
但目前HTML5与XHTML之间并不完全互通,这样做可能会引发一系列危险的问题。将HTML5映射到XHTML是危险的。自由地将HTML5用作XHTML没有任何优势(除非在私人环境中仅供内部使用,在这种情况下,您将完全控制生成、使用和本地验证DTD)。HTML5语法更简单、更安全可互换,并且解析和验证效率更高。 - verdy_p

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接