在XML文档中'standalone'指令是什么意思?
standalone
standalone描述当前XML文档是否依赖于外部标记声明。
W3C在“可扩展标记语言(XML) 1.0(第五版)”中描述了它的目的。:
标记声明可以影响 传递的文档内容 从XML处理器到 应用程序;例如属性 默认值和实体声明。的 独立文档声明 可以作为XML的组件出现 声明,表示是否 有这样的宣言 出现在文档实体的外部 或者参数实体。[定义: 外部标记声明为 定义为标记声明 发生在外部子集或内部的 参数实体(外部的或 内部的,后者包括在内 因为非验证处理器是 . .
标记声明可以影响 传递的文档内容 从XML处理器到 应用程序;例如属性 默认值和实体声明。的 独立文档声明 可以作为XML的组件出现 声明,表示是否 有这样的宣言 出现在文档实体的外部 或者参数实体。[定义: 外部标记声明为 定义为标记声明 发生在外部子集或内部的 参数实体(外部的或 内部的,后者包括在内 因为非验证处理器是
< a href = " http://www.w3.org/TR/xml/ sec-rmd”rel = " noreferrer " > http://www.w3.org/TR/xml/ sec-rmd < / >
standalone声明是告诉解析器忽略DTD中的任何标记声明的一种方式。DTD随后仅用于验证。
例如,考虑简单的<img>标记。如果你看一下XHTML 1.0 DTD,你会看到一个标记声明,告诉解析器<img>标记必须是空的,并且具有src和alt属性。当浏览器浏览XHTML 1.0文档并发现<img>标记时,它应该注意到DTD要求src和alt属性,如果它们不存在,就添加它们。它还会自关闭<img>标记,因为它应该是EMPTY。这就是<img>0所说的“标记声明可以影响文档的内容”。然后你可以使用standalone声明告诉解析器忽略这些规则。
<img>
src
alt
您的解析器是否真正做到这一点是另一个问题,但是符合标准的验证解析器(比如浏览器)应该做到。
请注意,如果您没有指定DTD,那么独立声明“没有意义”,因此没有理由使用它,除非您还指定了DTD。
yes
no
standalone="yes"
来源:独立伪属性仅在使用DTD时才相关
standalone=yes声明的目的是保证文档内部的信息只能基于内部DTD被忠实地检索到,即文档可以“独立”,没有外部引用。验证独立文档可确保非验证处理程序拥有正确解析文档所需的所有信息。
standalone=yes
如果文档没有外部DTD,内部DTD没有参数实体引用,那么独立声明就没有任何意义,因为这些文档已经是隐式独立的。
下面是使用standalone=yes的实际效果。
强制处理器在解析具有外部DTD或参数实体引用的文档时抛出错误,如果文档包含对未在内部DTD中声明的实体的引用(参数实体的替换文本除外,因为不需要验证处理器来解析它);amp, lt, gt, apos和quot是唯一的例外
amp
lt
gt
apos
quot
在解析未声明为独立的文档时,非验证处理程序可以在遇到参数实体引用时立即停止解析内部DTD。将文档声明为独立文档会迫使非验证处理器在内部DTD中解析标记声明,即使它们忽略了一个或多个参数实体引用。
强制验证处理器抛出错误,如果在文档中发现以下任何一种,并且它们各自的声明在外部DTD或参数实体替换文本中:
非验证处理器可能会考虑检索外部DTD并扩展非独立文档的所有参数实体引用,即使它没有义务这样做,即设置standalone=yes理论上可以提高非验证处理器的性能(剧剧警告:它可能不会有什么不同)。
这里的其他答案不是不完整就是不正确,主要的误解是
独立声明是告诉解析器忽略DTD中的任何标记声明的一种方式。DTD随后仅用于验证。
standalone="yes"意味着XML处理器必须只使用DTD进行验证。
恰恰相反,将文档声明为独立文档实际上会迫使非验证处理器解析它通常必须忽略的内部声明(即那些在被忽略的参数实体引用之后的声明)。非验证处理器仍然必须使用内部DTD中的信息来提供默认属性值和规范化标记化属性,因为这与验证无关。