有人可以解释为什么两条引用行都是必要的
<!DOCTYPE grammar PUBLIC "-//W3C//DTD GRAMMAR 1.0//EN"
"http://www.w3.org/TR/speech-grammar/grammar.dtd">
?这来自官方SRGS(http://www.w3.org/TR/speech-grammar/)文件,第2.7节。人们会认为后者的引用线注意到dtd的位置就足够了。我怀疑它与用英语指定语言有关,但文档没有解释这一点。感谢。
答案 0 :(得分:2)
如果XML文档应该对DTD有效,则只有后一个字符串(系统标识符)必须存在。
第一个引用的字符串是公共标识符,它是可选的。它用于通过名称而不是物理地址唯一标识DTD(或其他外部标识符)。通常可以假设公共标识符比http:
或file:
URL更稳定。即使系统标识符错误,或者互联网访问中断(例如),也可以找到DTD。
只使用
即可<!DOCTYPE grammar SYSTEM "http://www.w3.org/TR/speech-grammar/grammar.dtd">
请注意在这种情况下使用SYSTEM
关键字。
另见http://www.xml.com/axml/target.html#sec-external-ent。
关于W3C托管的DTD的使用,您可能对http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic/感兴趣。
答案 1 :(得分:1)
实际上SGML中的 (XML所基于的)URL(= SYSTEM标识符)与PUBLIC标识符的选择方式相同。如果存在关键字PUBLIC
,则应始终使用与您的案例中给定的正式公共标识符(FPI)"-//W3C//DTD GRAMMAR 1.0//EN"
匹配的内置DTD(来自目录)来验证文档。在SGML中,PUBLIC标识符后面可以跟一个系统标识符,该系统标识符应该被视为关于所使用的DTD的提示。 在XML 中已更改,因此PUBLIC标识符存在,必须后跟系统标识符;但这并没有改变这些标识符的逻辑或目的。
公共标识符表示本文档所遵循的规范,因此实际上它告诉整个文档中使用的语法,因此它在某种程度上与XML中的命名空间具有相同的目的。公共标识符的形式通常遵循通用结构,因此包含语言代码。此代码仅表示所引用的规范所使用的(自然/人类)语言,并不意味着文档本身将包含使用此语言。在您的情况下,DOCTYPE 不意味着您的文档应该使用,引用或关于英语。
DOCTYPE声明也可以包含关键字PUBLIC
,而不是SYSTEM
,这意味着应该以特定于系统的方式检索DTD。 SYSTEM
后面只有一个URL或文件路径。