【发布时间】:2021-01-08 00:00:55
【问题描述】:
DTD 提供了一种引用任意格式的外部实体的机制,因此允许 SGML 和 XML 文件链接到具有 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。
按照我的理解,这样做有三个好处:
- 标准化。无论使用任何实际模式,应用程序都可以找出文档链接到的所有内容,即使它可能不理解它。这可能对安全、搜索、过滤等有用。
- 避免重复。实体 URI 仅定义一次,但可以多次引用。
- 在实体旁边指定格式(符号)。如果系统不提供或不知道格式,或者有多种格式或显示方法可供选择(例如显示或下载),则无需在文档中添加这些信息。
然而,到目前为止,我还没有找到任何主要使用这种机制的数据集或应用程序。在实践中,所有这些点都被打败了:
- 绝大多数资源仍以特定于模式的方式链接,例如在 XHTML 中。 XLink 用于以 XML 方式标准化链接到资源。 XML Schema 定义了
anyURI,因此仍然可以自动找到链接(尽管嵌入和链接到资源之间存在差异)。 - 内部解析实体已经可以提供一种在文档的任何位置重用 URI 的方法。压缩进一步减少了关注数据集中较大文档的需要。
- 使用最广泛的 HTTP 提供了指定或协商目标文件格式的方法。这样做的好处是服务器不会被锁定以仅以特定格式存储文件;例如,它可以升级到更好的图像格式(即 PNG 而非 GIF),而无需修改任何引用它的文档。
我发现的所有关于这种机制的教程都简单地说明了它的用途(主要是从其他文档中复制段落),并附有上述自定义 DTD 的示例。此外,由于这样的实体只能包含在属性中,因此它实际上永远不会被视为任何元素内容的一部分,并且它的处理始终依赖于应用程序。
是否有使用或依赖外部实体和符号的系统?是否有应用程序可以识别以这种方式使用的实体并能够理解符号?我可以合理地使用什么样的符号公共 ID,以及系统 ID 的一些真实示例?实体或符号是否有通用公共 ID?
【问题讨论】: