带有额外信息的空 DTD 元素

Empty DTD Element with extra info

我知道 DTD 是如何工作的,当我想声明 <br>(或 <br/>)时,我必须这样做:

<!ELEMENT br EMPTY>

但是在这个文件 (https://www.w3.org/MarkUp/html-spec/html.dtd) 中,我发现了以下行:

<!ELEMENT BR    - O EMPTY>

我看大部分是一样的,但是-O有什么区别呢?我在哪里可以了解更多信息?

谢谢

-O(字母 O)字符是 SGML 标记省略指示符,并声明(对 SGML 解析器)开始- and/or 结束标记,分别,因为元素可以省略(如果 O)或必须存在(如果 -)。第一个 -O 字符用于开始元素标记,第二个字符用于结束元素标记。

例如,有效的 HTML 文档可能如下所示(为清楚起见,其中 "public identifier" 缩短为 ...):

<!DOCTYPE html PUBLIC "...">
<title>A valid HTML document</title>
<p>Body Text

SGML 使用 HTML DTD(包含 HTML 的元素和属性声明)来推断省略的标记,以便将示例标记解析为

<!DOCTYPE html PUBLIC "...">
<html>
  <head>
    <title>A valid HTML document</title>
  </head>
  <body>
    <p>Body Text</p>
  </body>
</html>

带有标记遗漏指示符的元素声明会使 SGML 解析器到达推断的和规范的标记是

<!ELEMENT html O O (head,body)>
<!ELEMENT head O O (title)>
<!ELEMENT body O O (#PCDATA,p)+>
<!ELEMENT p - O (#PCDATA)>

br 元素的情况很特殊,因为它是一个 EMPTY 元素(HTML 调用这些 "void elements",并且还有其他元素,例如 imghr)。在传统的 SGML 中,声明内容 EMPTY 的元素根本不允许有结束元素标记,使用结束标记省略指示符是多余的,甚至是误导性的。

对于现代 HTML(W3C HTML 5 和 5.1)的完整 SGML DTD,请参阅我从 http://sgmljs.net/blog/blog1701.html 链接的 project/paper。

请注意,HTML,自第 5 版起,不再发布 SGML DTD 或其他正式语法,也不再正式引用 SGML 标准 (ISO 8879) 作为规范参考。您偶然发现的声明可能来自旧的 HTML 4 规范。

编辑:还想澄清一下,对于在 XML 中使用 <br/> ,您不必声明它 EMPTY;事实上,您根本不需要申报任何东西;另外,既然你要求它,你可以去(我们的网站)http://sgmljs.net/docs/sgmlrefman.html 了解更多关于 SGML