Xml DTD外部未解析实体和符号是否在野外使用?
DTD提供了一种引用任意格式的外部实体的机制,从而允许SGML和XML文件链接到具有URI的任何文件,而无需为此创建自定义机制。因此,例如,可以在DTD中指定:Xml DTD外部未解析实体和符号是否在野外使用?,xml,dtd,sgml,Xml,Dtd,Sgml,DTD提供了一种引用任意格式的外部实体的机制,从而允许SGML和XML文件链接到具有URI的任何文件,而无需为此创建自定义机制。因此,例如,可以在DTD中指定: <!ELEMENT img EMPTY> <!ATTLIST img src ENTITY #REQUIRED> <!NOTATION gif PUBLIC "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN" &qu
<!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模式定义了
,因此仍然可以自动找到链接(不过嵌入和链接到资源之间有区别)anyURI
- 内部解析的实体已经提供了一种在文档中的任何位置重用URI的方法。压缩进一步减少了对数据集中较大文档的关注
- 最广泛使用的HTTP提供了指定或协商目标文件格式的方法。这具有一个优点,即服务器不会锁定为仅以特定格式存储文件;例如,它可以升级到更好的图像格式(即PNG优于GIF),而无需修改任何引用它的文档
XLink
和XInclude
更灵活。未解析的实体(和符号)很少使用,但我确信有一些SGML顽固分子在某处使用它们。这不是我会选择使用的机制,原因有二:它没有得到工具的很好支持,也不是很灵活
您的标题问题询问了外部未解析实体,但下面的一些文章更笼统地讨论了外部实体。外部解析的实体肯定比未解析的实体使用得更广泛(尽管存在安全问题),而且我肯定与使用它们的系统一起工作。但我不会选择使用它们
XLink
和XInclude
更灵活。DocBook和TEI主要使用符号和未分析的实体
它们还用于我的SGML软件()中的通用模板/参数化宏扩展机制,这在很大程度上是为了在不使用新语法的情况下向SGML添加特性。具体来说,在SGML(但不是XML)中,实体声明可以具有数据属性,如中所示
对XLink/XInclude的支持通常与实体/符号声明一样零散,甚至可以说比实体/符号声明更多,因为后者是核心SGML/XML构造(参见示例)。XInclude更严重的问题是,它以非预期的方式()与模式验证交互,因为它是作为XML应用程序/词汇表而不是核心特性分层的
XLink在纸上可能很好(我甚至不认为这是因为它盲目地在没有上下文的情况下引入HyTime概念,例如对链接角色的描述非常模糊,而不是简单的HTML链接)。但现实情况是,目前最常见的文档格式(即HTML)使用的URL是XML根本无法合理处理的,因为它允许并经常包含&
符号和字符,而XML总是希望将这些符号和字符解释为实体引用的开始。SGML的WebSGL修订版(由原始XML规范的作者创建,同时引入XML作为SGML的一个独立子集以对齐这两个规范)引入了数据规范属性(在中解释),并专门处理此问题
更新:关于在SGML和XML中使用的符号的常用公共标识符,有
- 历史性的、孤僻的
<!ENTITY e SYSTEM "..." NDATA sgml [ x=1 y=2 ]>