假设我们有这样的标记:
<ul>
<li>
<span></span>
</li>
</ul>
- li是ul的后代
- span是li的子代和后代
- span是ul的后代
阅读我们拥有的ul的规范:
内容模型:
零个或多个li和脚本支持元素。
以及内容模型的语义部分,比如(强调我的):
内容模型
必须包含哪些内容作为元素的
子项和子项的规范性描述。
我肯定想错了,但我无法计算两者。由于span不是"零个或多个li元素">的一部分,它是ul。
如果规范中说:"必须作为元素的子元素包含哪些内容的规范性描述。"我会理解,但这可能会与规范的其他部分冲突。
我的问题是如何解释这一点。
添加更多上下文。ul只能将li作为子项。但从上面来看,如果一个人忘记了他所知道的关于HTML等的一切,我会把它解释为两种之一:
- 它必须有零个或多个li元素,但也可以有其他元素,或者
- 它只能将li元素作为子元素和子元素
通过"零或更多">,后者更强大。
3.2.3元素定义中引用的描述相当松散,甚至具有误导性。下一部分3.2.4内容模型,描述了内容模型的真正含义:"本规范中定义的每个元素都有一个内容模型:对元素预期内容的描述。HTML元素的内容必须符合元素内容模型中描述的要求。元素的内容是其在DOM中的子元素,但模板元素除外,其中子元素是模板内容中的子。"。
因此,内容模型指定了允许的内容和要求的内容(尽管并非所有元素都有要求的内容),即子节点,这意味着子节点。这包括(如适用)元素childen和文本节点child(例如,某些元素只允许文本作为内容)。
这意味着ul
元素可以仅具有li
和script
元素作为子元素。li
元素有自己的内容模型,这些模型相当宽松。没有必需的内容;在HTML5中甚至允许CCD_ 5。