HTML规范中的子代和内容模型



假设我们有这样的标记:

<ul>
<li>
<span></span>
</li>
</ul>
  • liul的后代
  • spanli的子代和后代
  • spanul的后代

阅读我们拥有的ul的规范:

内容模型
零个或多个li和脚本支持元素。

以及内容模型的语义部分,比如(强调我的)

内容模型
必须包含哪些内容作为元素的
子项和子项的规范性描述。

我肯定想错了,但我无法计算两者。由于span不是"零个或多个li元素">的一部分,它是ul

如果规范中说:"必须作为元素的子元素包含哪些内容的规范性描述。"我会理解,但这可能会与规范的其他部分冲突。

我的问题是如何解释这一点。


添加更多上下文。ul只能将li作为子项。但从上面来看,如果一个人忘记了他所知道的关于HTML等的一切,我会把它解释为两种之一:

  • 它必须有零个或多个li元素,但也可以有其他元素,或者
  • 它只能li元素作为子元素和子元素

通过"零或更多">,后者更强大。

3.2.3元素定义中引用的描述相当松散,甚至具有误导性。下一部分3.2.4内容模型,描述了内容模型的真正含义:"本规范中定义的每个元素都有一个内容模型:对元素预期内容的描述。HTML元素的内容必须符合元素内容模型中描述的要求。元素的内容是其在DOM中的子元素,但模板元素除外,其中子元素是模板内容中的子。"。

因此,内容模型指定了允许的内容和要求的内容(尽管并非所有元素都有要求的内容),即子节点,这意味着子节点。这包括(如适用)元素childen和文本节点child(例如,某些元素只允许文本作为内容)。

这意味着ul元素可以仅具有liscript元素作为子元素。li元素有自己的内容模型,这些模型相当宽松。没有必需的内容;在HTML5中甚至允许CCD_ 5。

最新更新