空元素和无内容元素是相同的吗?

17
自90年代以来,我一直在编写HTML,但我刚刚发现了colgroupcol元素。根据MDN的说明col是一个无内容元素,因此禁止使用结束标记

标签省略:开始标签是必需的,但由于它是一个无内容元素,因此禁止使用结束标记。

我以前从未听说过无内容元素。MDN没有无内容元素的页面,但Empty element页面上说:

注意:在极少数情况下,空元素被称为无内容元素。这是不正确的名称,应该避免使用。

然而,W3规范仅提到无内容元素,从未提及空元素:

无内容元素是指其内容模型在任何情况下都不允许其具有内容的元素。无内容元素可以具有属性。

所以我想知道:
  1. 如果它们是同一件事,它们应该被称为空元素,而不是无内容元素吗?在这种情况下,W3规范是否已过时,不值得信赖?还是说W3规范应该优先考虑,即使它已过时?
  2. 如果它们不是同一件事,那么<col span="2" />是否有效,还是应该使用<col span="2">(没有斜杠),因为结束标记是被禁止的?我可能对“结束标记”有误解,但我一直认为/>(如<br /><img />中)是某种形式的结束标记。

4
我不认为有任何理由相信第三方来源胜过第一方来源,特别是当第三方来源在自己的文本中使用两个术语互换时,它本身就与其所说的相矛盾。 - BoltClock
为什么你不试一下,看看它是否有效? - Huangism
无内容元素有一种特殊的表示方式,称为自闭合标签。空元素将有单独的结束标签但没有内容。 - RBT
MDN的“空元素页面”现在指向“无内容元素”页面。 - mnemotronic
2个回答

16
“空元素”一词来自 SGML,HTML5 之前的 HTML 标准基于 SGML,其中使用 EMPTY 关键字表示内容模型为空的元素。以下是 HTML 4 规范 的说明:
“元素允许的内容称为其内容模型。设计为不包含任何内容的元素类型称为‘空元素’。此类元素类型的内容模型使用关键字‘EMPTY’进行声明。”
下面是对 img 元素的示例声明:

This example illustrates the declaration of an empty element type:

<!ELEMENT IMG - O EMPTY>
  • The element type being declared is IMG.
  • The hyphen and the following "O" indicate that the end tag can be omitted, but together with the content model "EMPTY", this is strengthened to the rule that the end tag must be omitted.
  • The "EMPTY" keyword means that instances of this type must not have content.

XML 定义"空元素"的方式与众不同:

[定义:没有内容的元素被称为空元素。]

这里的区别在于,XML并未说"空元素"是"其内容模型为空的元素"。相反,它只是说"空元素"是没有内容的元素。无论文档类型或XML模式是否定义了该特定元素必须没有内容,XML本身都不会施加此类限制。

另外一个术语"空元素标签"用于描述常用的表示空元素的快捷语法/>(同样不管它们是否根据定义为空)。这也通常称为"自闭合"语法。

术语"空元素"是HTML5中的新词。它与 HTML5 之前的“空元素”定义相同,即一个元素有开始标签,没有结束标签,且不能包含任何内容。虽然 W3C HTML5 规范未涉及“空元素”这个术语,但在相关文档中使用了 XML 中描述的“空元素标签”的术语:related document

在 HTML 语法中,无内容元素是一种始终为空且永远不具有结束标记的元素。在 HTML 规范或扩展规范中列出的所有无内容元素,在混合标记中必须具有 XML 空元素标签 的句法形式(<foo/>)。其他元素不得使用 XML 空元素标签语法。

看起来现代HTML标准现在更喜欢XML定义,而避免以前的定义。这似乎很合适,因为现代HTML不再是SGML应用程序,而是一种标记语言“本身”。(它也不是XML,但这就是多语言标记的作用所在。)
因此,总结一下:
- 空元素是指没有内容的元素,无论它是否首先允许有内容。 - 无效元素是不能有任何内容的元素。
此外,可以说所有无效元素都是根据定义为空元素,但空元素不一定代表无效元素。
回答您的问题:
  1. 如果它们是同一件事,它们应该被称为空元素而不是无内容元素吗?在这种情况下,W3规范是否已经过时且不可信?还是说W3规范应该优先考虑,即使它已经过时?

    例如areabrcolimg等元素更准确地被称为无内容元素,在HTML5中。它们也被认为是空的,但仅因为它们不能是“非空的”。

    我不知道为什么MDN有一篇文章说“['Void elements']是一个不恰当的名称,应该避免使用。”,但它在大多数HTML参考中仍然使用这个名称。我看不出任何理由不相信官方规范。

  2. 如果它们不是同一件事,那么<col span="2" />是否是有效的语法,或者应该是<col span="2">(没有斜杠),因为结束标记是禁止的?我可能对“结束标记”有错误的想法,但我一直认为/>(如<br /><img />)是某种结束标记。

    <col span="2" />只有在HTML5将其识别为标记无内容元素的流行方式时才是有效语法,这要归功于XHTML,并且禁止它会不必要地破坏与许多XHTML文档的验证兼容性。HTML5本身定义/>是毫无意义的(除了一个特定的例外,这里并不重要),因此实际上,在HTML5中<col span="2" />仅表示一个只有开始标记而没有结束标记的col,因此与<col span="2">相同,但友好于XML。


2
您所引用的“W3规范”是一个非权威性的参考资料。W3C推荐的HTML 4.01将空元素称为具有声明为空的内容的EMPTY元素,即不能包含任何内容的元素。它根本没有使用“void element”这个短语。
HTML5草案指定了在HTML 4.01中作为空元素的元素具有“empty”内容模型,但实际上并没有定义这样的模型。相反,它提到void elements并表示它们“不能有任何内容”。
因此,混淆出现在HTML5草案中。与此无关,重要的是要区分那些无法(按照规范和实际应用的解析规则)拥有任何内容的空/虚元素和那些只是恰好有空内容的元素,例如空的<p>元素(不良实践)和空的<td>元素(通常是不良实践,但有效且有时足够)。

我没有意识到有这么多文件,所以我以为我正在查看“规范”。谢谢你指出来。 - Big McLargeHuge

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