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
,并带有特定的格式。
据我理解,这样做有三个好处:
- 标准化。无论使用何种实际模式,都可以让应用程序找出文档 link 指向的所有内容,即使它可能不理解它。这可能对安全、搜索、过滤等很有用。
- 避免重复。实体URI只定义一次,但可以多次引用。
- 在实体旁边指定格式(符号)。如果系统不提供或不知道格式,或者有多种格式或显示方法可供选择(例如显示或下载),则无需使用此信息使文档混乱。
然而,到目前为止,我还没有找到任何主要使用这种机制的数据集或应用程序。在实践中,所有这些点都被击败了:
- 绝大多数资源仍然link以特定于模式的方式编辑,就像在 XHTML 中一样。 XLink 用于以 XML 方式对资源进行标准化 linking。 XML 架构定义了
anyURI
,所以仍然可以自动找到 link(虽然嵌入和 linking 到资源之间是有区别的)。
- 内部解析的实体已经可以提供一种在文档中的任何位置重用 URI 的方法。压缩进一步减少了关心数据集中较大文档的需要。
- 使用最广泛的 HTTP 提供了指定或协商目标文件格式的方法。这样做的好处是服务器不会被锁定为仅以特定格式存储文件;例如,它可以升级到更好的图像格式(即 PNG over GIF),而无需修改任何引用它的文档。
我找到的所有关于此机制的教程都简单地说明了它的用途(主要是从其他文档中复制段落)以及自定义 DTD 的示例,如上面的示例。此外,由于像这样的实体只能包含在属性中,因此它实际上永远不会被视为任何元素内容的一部分,并且其处理始终取决于应用程序。
是否有使用或依赖外部实体和符号的系统?是否有识别以这种方式使用的实体并能够理解符号的应用程序?我可以合理地使用什么样的 public 符号 ID,以及系统 ID 的一些真实示例是什么?实体或符号是否有通用的 public ID?
很少使用未解析的实体(和符号),但我确信有一些 SGML 顽固分子在某处使用它们。这不是我会选择使用的机制,原因有二:它没有得到工具的很好支持,而且它不是很灵活。
您的标题问题询问的是外部未解析的实体,但以下一些散文更笼统地讨论了外部实体。外部解析的实体肯定比未解析的实体使用更广泛(尽管存在安全问题),我当然与使用它们的系统一起工作。但我不会选择使用它们; XLink
和 XInclude
更灵活。
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)中还有著名的特殊字符实体集。
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
,并带有特定的格式。
据我理解,这样做有三个好处:
- 标准化。无论使用何种实际模式,都可以让应用程序找出文档 link 指向的所有内容,即使它可能不理解它。这可能对安全、搜索、过滤等很有用。
- 避免重复。实体URI只定义一次,但可以多次引用。
- 在实体旁边指定格式(符号)。如果系统不提供或不知道格式,或者有多种格式或显示方法可供选择(例如显示或下载),则无需使用此信息使文档混乱。
然而,到目前为止,我还没有找到任何主要使用这种机制的数据集或应用程序。在实践中,所有这些点都被击败了:
- 绝大多数资源仍然link以特定于模式的方式编辑,就像在 XHTML 中一样。 XLink 用于以 XML 方式对资源进行标准化 linking。 XML 架构定义了
anyURI
,所以仍然可以自动找到 link(虽然嵌入和 linking 到资源之间是有区别的)。 - 内部解析的实体已经可以提供一种在文档中的任何位置重用 URI 的方法。压缩进一步减少了关心数据集中较大文档的需要。
- 使用最广泛的 HTTP 提供了指定或协商目标文件格式的方法。这样做的好处是服务器不会被锁定为仅以特定格式存储文件;例如,它可以升级到更好的图像格式(即 PNG over GIF),而无需修改任何引用它的文档。
我找到的所有关于此机制的教程都简单地说明了它的用途(主要是从其他文档中复制段落)以及自定义 DTD 的示例,如上面的示例。此外,由于像这样的实体只能包含在属性中,因此它实际上永远不会被视为任何元素内容的一部分,并且其处理始终取决于应用程序。
是否有使用或依赖外部实体和符号的系统?是否有识别以这种方式使用的实体并能够理解符号的应用程序?我可以合理地使用什么样的 public 符号 ID,以及系统 ID 的一些真实示例是什么?实体或符号是否有通用的 public ID?
很少使用未解析的实体(和符号),但我确信有一些 SGML 顽固分子在某处使用它们。这不是我会选择使用的机制,原因有二:它没有得到工具的很好支持,而且它不是很灵活。
您的标题问题询问的是外部未解析的实体,但以下一些散文更笼统地讨论了外部实体。外部解析的实体肯定比未解析的实体使用更广泛(尽管存在安全问题),我当然与使用它们的系统一起工作。但我不会选择使用它们; XLink
和 XInclude
更灵活。
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 构造(参见例如
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)中还有著名的特殊字符实体集。