standalone
'指令是什么意思?standalone
'指令是什么意思?standalone
声明是告诉解析器忽略DTD中的任何标记声明的一种方式。此后,DTD仅用于验证。<img>
标签为例。如果查看XHTML 1.0 DTD,就会发现有一个标记声明告诉解析器<img>
标签必须为空,并具有src
和alt
属性。当浏览器遍历XHTML 1.0文档并找到<img>
标签时,它应该注意到DTD需要src
和alt
属性,并在它们不存在时添加它们。它也会自动关闭<img>
标签,因为它应该为空。这就是XML规范所说的“标记声明可能影响文档内容”的含义。然后可以使用standalone
声明告诉解析器忽略这些规则。standalone="yes"
指定 XML 内容不能有任何影响的_外部_标记声明。也就是说,standalone="yes"
的文档可能具有内部 DTD 子集,用于声明属性默认值和实体声明,并且进一步在内容中引用。 - Stanimir Stamenkovstandalone=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中的信息来提供默认属性值和规范化标记化属性,因为这与验证无关。