【发布时间】:2011-07-31 12:31:37
【问题描述】:
XML 文档中的“standalone”指令是什么意思?
【问题讨论】:
标签: xml
XML 文档中的“standalone”指令是什么意思?
【问题讨论】:
标签: xml
standalone 描述当前 XML 文档是否依赖于外部标记声明。
W3C 在“可扩展标记语言(XML)1.0(第五版)”中描述了它的用途:
【讨论】:
标记声明会影响 文件的内容,如通过 从 XML 处理器到 应用;例子是属性 默认值和实体声明。这 独立文件声明,其中 可能作为 XML 的一个组件出现 声明,信号是否 有这样的声明 出现在文档实体的外部 或在参数实体中。 [定义: 外部标记声明是 定义为标记声明 发生在外部子集中或 参数实体(外部或 内部,后者包括在内 因为非验证处理器是 不需要阅读它们)。]
【讨论】:
standalone 声明是一种告诉解析器忽略DTD 中的任何标记声明的方法。此后,DTD 仅用于验证。
例如,考虑不起眼的<img> 标签。如果您查看XHTML 1.0 DTD,您会看到一个标记声明告诉解析器<img> 标记必须为空并且具有src 和alt 属性。当浏览器浏览 XHTML 1.0 文档并找到 <img> 标记时,它应该注意到 DTD 需要 src 和 alt 属性,如果它们不存在则添加它们。它还会自动关闭<img> 标签,因为它应该是空的。这就是XML specification 所指的“标记声明会影响文档的内容”。然后您可以使用standalone 声明告诉解析器忽略这些规则。
您的解析器是否真的这样做是另一个问题,但符合标准的验证解析器(如浏览器)应该这样做。
请注意,如果您不指定 DTD,那么独立声明“没有意义”,因此除非您还指定 DTD,否则没有理由使用它。
【讨论】:
standalone=yes,标记声明不会被忽略,而是会导致文档成为无效的 XML。你介意我把它编辑成答案吗?
yes 和no,其中no 是默认值。standalone="yes" 表示 XML 处理器必须仅使用 DTD 进行验证。在这种情况下,它将不用于:
standalone="yes" 可能会添加有效性约束。当文档包含需要修改 XML 的内容时,例如属性的默认值,并且使用 standalone="yes" then the document is invalid。standalone="yes" 可能有助于优化文档处理的性能。来源:The standalone pseudo-attribute is only relevant if a DTD is used
【讨论】:
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 中的信息来提供默认属性值并规范化标记化属性,因为这与验证无关。
【讨论】: