【问题标题】:why will a dl tag without a dt tag validate为什么没有 dt 标签的 dl 标签会生效
【发布时间】:2013-12-01 11:04:06
【问题描述】:

我最近遇到了一个使用定义列表标签的网站,尽管使用不正确,但仍然如此。他们使用它们时没有将定义标题声明为定义列表的第一个子项。

出于好奇,我通过 w3c 验证器输入了以下内容

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
</head>
<body>
    <dl>
        <dd>description</dd>
        <dd>description</dd>
        <dd>description</dd>
    </dl>
</body>
</html>

为什么会验证?当然它在语义上没有一点意义吗?还是我只是遗漏了一些非常明显的东西?

【问题讨论】:

  • spec 有一段关于dl 元素内容模型的DTD 摘录。它只是说dl 可以有dt 和/或dd 孩子,并且不能为空。由于 HTML 4 验证只涉及检查文档是否符合 DTD,这就是使其验证的原因。验证不会检查文档的语义,除非这些语义已编入 DTD。
  • @BoltClock,您似乎已将评论扩展为答案,然后将其删除 - 我不明白为什么。这是一个相当准确的答案。
  • @Jukka K. Korpela:我不确定我是否通过简单地说它验证的唯一原因是因为它符合 DTD 来完全回答这个问题。但仔细想想,你是对的 - 我会恢复它。

标签: html validation w3c


【解决方案1】:

标记验证的主要目的是在一定程度上检查标记的语法,以及某些特定元素类型和属性的结构。它不会评估您的标记的语义。

对于像 HTML 4 这样使用 DTD 进行验证的语言,唯一需要检查的是标记是否符合该 DTD,并且您只能将语义指定到 DTD 中。例如,只要您正确标记了一个表格,无论您是将其用于布局还是用于表格数据,它仍然可以验证,因为您无法单独使用 DTD 来判断该表格是怎样的即使标记正确也会被使用。

在这种情况下,HTML 4.01 spec 和 DTD1 关于dl 元素的唯一说明是它可以有dtdd 子元素(或两者) ,并且不能为空:

<!-- definition lists - DT for term, DD for its definition -->

<!ELEMENT DL - - (DT|DD)+              -- definition list -->
<!ATTLIST DL
  %attrs;                              -- %coreattrs, %i18n, %events --
  >

即使是 HTML 4.01 规范也没有详细说明 dl 的各种可能的内容模型。它并没有说明是否有意义拥有一个没有关联 dt 内容的 dd 元素列表,或者需要将您的 dd 元素与至少一个 dt 关联元素。

HTML5 does 但是,非常简洁地声明

如果dl 元素有一个或多个dd 子元素但没有dt 子元素,则它由一组有值但没有名称。

可以这么说,就功能和语义而言,它有点像ul。当然,在这种情况下,您不妨改用ul,但要么在一组未命名的关联值和无序列表之间存在细微差别,要么标准完全接受了dl 只有 dd 孩子。


1您可能想知道,为什么不让 HTML 4 DTD 要求每个 dl 至少有一个 dt 子级(并且可选地至少有一个 dd去吧)?除了在 HTML5 仍然允许它的情况下这已经无关紧要之外,这不是我可以回答的问题。

【讨论】:

  • 关于脚注,似乎没有任何解释,因此可以公平地假设他们只是想保持语法规则简单。更合乎逻辑的方法会更复杂,可能使用内容模型(DT) (DT | DD)* (DD)
  • 我在这里面临一个案例,我们有一个 DL 动态构建。拥有dl 是有意义的,因为我们在那里有术语及其定义。然而,一些dd,一般来说是“显而易见的”,所以没有必要在那里添加那些dt。例如,您将dd 作为日期,您知道这些是日期,因此,无需添加dt 来表示:“日期”。 (不确定可访问性是否在这里起作用)。据我所知,对于这种情况,我很高兴它被允许在definition list 中包含一些没有definition terms 的元素。你说什么?
  • @MEM:任何跟在至少一个 dt 之后的 dd 将始终与该 dt(最接近的一个)相关联。如果你的 dl 只包含一个带日期的 dd,那么保持这种方式很好,但如果它是动态的,为了简单起见,我建议总是给每个 dd 一个 dt。
猜你喜欢
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2012-10-25
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多