DTD 是否在野外使用外部未解析的实体和符号?

Are DTD external unparsed entities and notations used in the wild?

DTD 提供了一种引用任意格式的外部实体的机制,因此允许 SGML 和 XML 文件 link 到具有 URI 的任何文件,而无需为此创建自定义机制。因此,例如,可以在 DTD 中指定:

<!ELEMENT img EMPTY>
<!ATTLIST img src ENTITY #REQUIRED>
<!NOTATION gif PUBLIC "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN" "image/gif">
<!ENTITY myimg1 SYSTEM "img1.gif" NDATA gif>
<!ENTITY myimg2 SYSTEM "img2.gif" NDATA gif>
<!ENTITY myimg3 SYSTEM "img3.gif" NDATA gif>

在创建 img 元素时,可以使用 myimg1 之类的值,并且应通知使用文档的应用程序引用了文件 img1.gif,并带有特定的格式。

据我理解,这样做有三个好处:

然而,到目前为止,我还没有找到任何主要使用这种机制的数据集或应用程序。在实践中,所有这些点都被击败了:

我找到的所有关于此机制的教程都简单地说明了它的用途(主要是从其他文档中复制段落)以及自定义 DTD 的示例,如上面的示例。此外,由于像这样的实体只能包含在属性中,因此它实际上永远不会被视为任何元素内容的一部分,并且其处理始终取决于应用程序。

是否有使用或依赖外部实体和符号的系统?是否有识别以这种方式使用的实体并能够理解符号的应用程序?我可以合理地使用什么样的 public 符号 ID,以及系统 ID 的一些真实示例是什么?实体或符号是否有通用的 public ID?

很少使用未解析的实体(和符号),但我确信有一些 SGML 顽固分子在某处使用它们。这不是我会选择使用的机制,原因有二:它没有得到工具的很好支持,而且它不是很灵活。

您的标题问题询问的是外部未解析的实体,但以下一些散文更笼统地讨论了外部实体。外部解析的实体肯定比未解析的实体使用更广泛(尽管存在安全问题),我当然与使用它们的系统一起工作。但我不会选择使用它们; XLinkXInclude 更灵活。

DocBook 和 TEI 主要使用符号和未解析的实体。

它们还用于我的 SGML 软件 (http://sgmljs.net) 中的通用 templating/parametric 宏扩展机制,主要体现了在不使用新语法的情况下向 SGML 添加功能的精神。具体来说,在 SGML 中(但不是 XML),实体声明可以具有 数据属性 ,如

<!ENTITY e SYSTEM "..." NDATA sgml [ x=1 y=2 ]>

对 XLink/XInclude 的支持通常与 entity/notation 声明一样参差不齐,甚至可以说甚至更多,因为后者是核心 SGML/XML 构造(参见例如 ). The more grave concern with XInclude is that it interacts with schema validation in unintended ways (XInclude Schema/Namespace Validation?),因为它被分层为 XML application/vocabulary 而不是核心功能。

XLink 在纸面上可能很好(我不认为它甚至是考虑到它盲目地引入了 HyTime 概念而没有上下文,例如,除了普通 [=69= 之外,link 角色的规格非常模糊]-like links)。但现实情况是,目前最常见的文档格式(即 HTML)使用的 URL XML 根本无法合理处理,因为它允许并且经常包含 & 符号字符,XML 总是想将其解释为实体引用的开始。 SGML 的 WebSGML 修订版(由原始 XML 规范的作者创建,并引入 XML 作为 SGML 的独立子集以对齐这两个规范)引入了 数据规范属性(在http://sgmljs.net/docs/parsing-html-tutorial/parsing-html-tutorial.html中有解释)专门处理这个问题。

更新:关于在 SGML 和 XML 中常用的 public 符号标识符,有

  • 历史悠久的、已撤销的 ISO/IEC 9070 规范及其定义的标识符 (参见 http://xml.coverpages.org/wg4-n1990.html

  • 较旧的 ISO HTML 4 规范 (ISO/IEC 15445) 为 (ISO) HTML 分配备用 public 标识符,而不是井-已知的 W3C HTML 4(参见 http://www.cs.tcd.ie/misc/15445/15445.dtd

  • ISO/IEC10744(HyTime 第 2 版)的存储符号标识符,尽管这些实际上仅用于 正式系统标识符(参见例如 http://sgmljs.net/docs/sgmlrefman.html#identifiers 的解释),其中有一个约定,用于通过 MIME/IANA 媒体类型关联

    为要用作查看器应用程序的外部程序定义符号
  • 在 ISO/IEC 8879:1986 技术勘误 2(又名 WebSGML 又名附件 K)中建立新标识符的约定,将唯一标识符的形成委托给域名解析;例如 +//IDN www.someisp.net/users/mtb 指的是规范文档位于规范位置 http://www.someisp.net/users/mtb

    的符号

在 SGML、HTML 和 XML(特别是 MathML)中还有著名的特殊字符实体集。