【问题标题】:Are DTD external unparsed entities and notations used in the wild?是否在野外使用 DTD 外部未解析实体和符号?
【发布时间】: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?

【问题讨论】:

    标签: xml dtd sgml


    【解决方案1】:

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

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

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

    对 XLink/XInclude 的支持通常与实体/符号声明一样参差不齐,甚至可以说甚至更多,因为后者是核心 SGML/XML 构造(参见例如Trying to use XInclude with Java and resolving the fragment with xml:id)。 XInclude 更严重的问题是它以非预期的方式与模式验证交互 (XInclude Schema/Namespace Validation?),因为它被分层为 XML 应用程序/词汇,而不是核心功能。

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

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

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

    • 较早的 ISO HTML 4 规范 (ISO/IEC 15445) 为 (ISO) HTML 分配备用公共标识符,而不是为 W3C HTML 4 分配众所周知的公共标识符(请参阅http://www.cs.tcd.ie/misc/15445/15445.dtd

    • ISO/IEC 10744(HyTime 第 2 版)的存储符号标识符,尽管这些实际上仅用于 正式系统标识符(参见例如 http://sgmljs.net/docs/sgmlrefman.html#identifiers 的解释),其中一个通过 MIME/IANA 媒体类型关联为要用作查看器应用程序的外部程序定义符号的约定

    • 在 ISO/IEC 8879:1986 Technical Corrigendum 2(又名 WebSGML aka Annex K)中建立新标识符的约定,将唯一标识符的形成委托给域名解析;例如+//IDN www.someisp.net/users/mtb 指的是其规范文档位于规范位置http://www.someisp.net/users/mtb 的符号

    SGML、HTML 和 XML(特别是 MathML)中的特殊字符也有众所周知的实体集。

    【讨论】:

      【解决方案2】:

      未解析的实体(和符号)很少使用,但我敢肯定有一些 SGML 顽固分子在某处使用它们。这不是我会选择使用的机制,原因有两个:工具支持不充分,而且不够灵活。

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

      【讨论】:

      • 我主要考虑未解析的实体,主要是出于好奇:我应该使用什么约定或受到 if 我选择使用它们的启发(不是我想要的)。
      • 除了避免使用它们之外,我无法提出任何建议。并不是说它们有害;只是对他们的支持并不多。例如,XSLT 对未解析的实体只有非常基本的支持(例如,您不能生成包含它们的结果文档。)
      猜你喜欢
      • 1970-01-01
      • 2014-10-20
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      相关资源
      最近更新 更多