有没有有效的HTML5片段?

jl6*_*jl6 5 validation html5 fragment

我显然无法确定HTML片段是否有效而不知道文档的其余部分是什么样的(至少,我需要一个doctype才能知道我正在验证哪些规则).但是给出以下HTML5片段:

<article><header></article>My header</header><p>My text</p></article>
Run Code Online (Sandbox Code Playgroud)

如果没有看到文档的其余部分,我当然可以确定它是无效的.那么,是否存在"临时有效"HTML或"有效提供它适合有效文档中的某个位置"这样的事情?

它比下面的伪代码更多吗?

def is_valid_fragment(fragment):
 tmp = "<!doctype html><html><head><title></title></head><body>" + fragment + "</body></html>"
 return my_HTML5_validator.is_valid_html5_document(tmp)
Run Code Online (Sandbox Code Playgroud)

Tom*_*son 5

您当然可以谈论格式良好XML文档,也可以从任何单个元素及其子元素构建文档。因此,您可以谈论格式良好的单根 XHTML5 片段。您可以通过将多根片段(如)作为文档序列处理,或将其包装在某个合成容器元素中来处理多根片段(如) - 因为我们只讨论格式良好,所以没问题。<img/><img/>

但是,HTML5 仍然允许 SGML 自闭合标签,例如<hr>等等,它们的自闭合性只能通过对 doctype 的上诉来确定。例如,<div><hr></div>可以,但<div><tr></div>不是。如果您正在处理 DOM 节点而不是文本作为输入,这将不是问题,但如果您有文本,则需要一个对 HTML 有足够了解的解析器来处理这些元素。但是,除此之外,一些直接从 XML 中提取的非常简单的规则就足以处理格式良好的问题。

如果您想超越格式良好并着眼于有效性的某些方面,我认为您仍然可以使用 XML 在单根片段级别做到这一点。正如规范所说:

如果 XML 文档具有关联的文档类型声明并且文档符合其中表达的约束,则它是有效的。

DTD 可以将任何元素命名为根元素,然后机制负责检查该元素与其子元素、它们的子元素等之间的关系,以及构成有效性的各种其他约束。

同样,您可以将该想法直接转换为 HTML。不过,我不知道你如何处理多根片段。并且请记住,某些整个文档的约束(例如唯一的 ID)可能会保留在片段中,但一旦片段插入其中,就不会保留在其他有效文档中。