Answers:
该standalone
声明是告诉解析器忽略任何标记声明的方式DTD。此后,DTD仅用于验证。
例如,考虑谦虚<img>
标签。如果查看XHTML 1.0 DTD,则会看到一个标记声明,告诉解析器<img>
标记必须为EMPTY并具有src
和alt
属性。当浏览器浏览XHTML 1.0文档并找到<img>
标签时,它应该注意到DTD要求src
和alt
属性,如果不存在,则添加它们。由于<img>
标签应该是空的,因此也会自动关闭标签。这就是XML规范 “标记声明可能影响文档的内容”的含义。然后,您可以使用该standalone
声明来告诉解析器忽略这些规则。
解析器是否实际执行此操作是另一个问题,但是应该符合标准的验证解析器(如浏览器)。
请注意,如果您未指定DTD,则独立声明“没有任何意义”,因此除非您也指定了DTD,否则没有理由使用它。
standalone=yes
,不会忽略标记声明,相反,它们会使文档成为无效的XML。您介意我将其编辑为答案吗?
标记声明会影响从XML处理器传递到应用程序的文档内容;示例包括属性默认值和实体声明。独立文档声明(可能显示为XML声明的组成部分)表明是否存在出现在文档实体外部或参数实体中的此类声明。[定义:外部标记声明被定义为在外部子集或参数实体(外部或内部,之内包括了后者,因为不需要验证处理器来读取它们)中的标记声明。
standalone=yes
声明的目的是确保仅基于内部DTD可以忠实地检索文档内部的信息,即,文档可以“独立”,而无需外部引用。验证独立文档可确保未验证的处理器将拥有所有可用于正确解析文档的信息。
如果文档没有外部DTD且内部DTD没有参数实体引用,则独立声明没有任何作用,因为这些文档已经隐式独立。
以下是使用的实际效果standalone=yes
。
如果文档包含对未在内部DTD中声明的实体的引用,则在使用外部DTD或参数实体引用解析文档时,迫使处理器抛出错误(参数实体的替换文本不需要,因为非验证处理器不需要解析);amp
,lt
,gt
,apos
,并且quot
是唯一的例外
解析未声明为独立的文档时,非验证处理器可以在遇到参数实体引用后立即停止解析内部DTD。将文档声明为独立文档会迫使非验证处理器在内部DTD中解析标记声明,即使它们忽略一个或多个参数实体引用也是如此。
如果在文档中找到以下任何内容,并且它们的相应声明在外部DTD或参数实体替换文本中,则强制验证处理器抛出错误:
amp
,lt
,gt
,apos
,和quot
)即使没有义务,非验证处理器也可以考虑检索外部DTD并为非独立文档扩展所有参数实体引用,即standalone=yes
,从理论上讲,设置可以提高非验证处理器的性能(破坏者警报:它可能不会有所作为)。
这里的其他答案是不完整的或不正确的,主要的误解是
独立声明是一种告诉解析器忽略DTD中任何标记声明的方法。此后,DTD仅用于验证。
standalone =“ yes”表示XML处理器必须将DTD仅用于验证。
相反,将文档声明为独立文档实际上将迫使非验证处理器解析通常必须忽略的内部声明(即,在忽略的参数实体引用之后的内部声明)。非验证处理器仍必须使用内部DTD中的信息来提供默认属性值并标准化标记化的属性,因为这与验证无关。