为什么没有dt标签的dl标签会验证

时间:2013-11-18 10:22:27

标签: html validation w3c

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

出于好奇,我将以下内容通过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>

为什么这会验证?当然它在语义上没有舔感觉?还是我完全错过了一些完全明显的东西?

1 个答案:

答案 0 :(得分:5)

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

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

在这种情况下,HTML 4.01 spec和DTD 1 dl元素的唯一说法是它可以有dt或{{ 1}}孩子(或两者),不能为空:

dd

即使HTML 4.01规范也没有详细说明<!-- definition lists - DT for term, DD for its definition --> <!ELEMENT DL - - (DT|DD)+ -- definition list --> <!ATTLIST DL %attrs; -- %coreattrs, %i18n, %events -- > 的各种可能内容模型。它没有说有意义是否有dl元素列表而没有关联的dd内容,或者需要关联dt至少有一个dd元素的元素。

然而,

HTML5 does非常简洁地说明了

  

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

可以说,就功能和语义而言,这有点像dt。当然,在这种情况下,你也可以改用ul,但是一个未命名的关联值组和一个无序的事物列表之间存在细微差别,或者标准对这个想法非常满意只有ul个孩子的dl


1 您可能想知道,为什么不让HTML 4 DTD要求每个dd至少有一个dl孩子(至少可选择)一个dt与它一起去)?除了在HTML5面前这仍然无关紧要的事实,无论如何它仍然是允许的,但这不是我能回答的问题。