XML中的“独立”指令是什么意思?

XML文档中的“ standalone ”指令是什么意思?

standalone声明是告诉parsing器忽略DTD中的任何标记声明的一种方式。 此后,DTD仅用于validation。

作为一个例子,考虑一下谦虚的<img>标签。 如果您查看XHTML 1.0 DTD ,则会看到一个标记声明,告诉parsing器<img>标记必须是EMPTY,并具有srcalt属性。 当浏览器浏览XHTML 1.0文档并find<img>标签时,应该注意到DTD需要srcalt属性,如果它们不存在,就添加它们。 它也会自动closures<img>标签,因为它应该是EMPTY。 这是XML规范的意思,即“标记声明可以影响文档的内容”。 然后,您可以使用standalone声明来告诉parsing器忽略这些规则。

无论你的parsing器是否真的这样做是另一个问题,但一个符合标准的validationparsing器(如浏览器)应该。

请注意,如果您不指定DTD,则独立声明“没有意义”,所以除非您还指定DTD,否则没有理由使用它。

  • 独立指令是XML声明中的可选属性。
  • 有效值为yesno ,其中no是缺省值。
  • 该属性仅在使用DTD时相关。 (使用模式而不是DTD时,该属性是不相关的。)
  • standalone="yes"表示XML处理器必须仅使用DTD进行validation。 在这种情况下,它不会被用于:
    • 属性的默认值
    • 实体声明
    • 正常化
  • 请注意,如果文档使用外部DTD,则standalone="yes"可能会添加有效性限制。 当文档包含需要修改XML的内容(如属性的默认值),并使用standalone="yes" , 则文档无效 。
  • standalone="yes"可能有助于优化文档处理的性能。

来源: 这个真棒解释

standalone描述当前的XML文档是否依赖于外部标记声明。

W3C在“可扩展标记语言(XML)1.0(第五版)”中描述了其目的:

  • 2.9独立文件声明

标记声明可以影响从XML处理器传递到应用程序的文档内容; 示例是属性默认值和实体声明。 独立文档声明(可能作为XML声明的一个组件出现)表示是否存在出现在文档实体或参数实体外部的声明。 [定义:外部标记声明被定义为发生在外部子集或参数实体中的标记声明(外部或内部,后者被包含,因为不需要validation处理器来读取它们)。]

http://www.w3.org/TR/xml/#sec-rmd

standalone=yes声明的目的是保证文档内的信息能够仅仅基于内部DTD被忠实地检索,即文档可以“独立”而不需要外部参考。 validation独立文档可确保validation和未validation的处理器将提供完全相同的信息。

如果文档没有外部DTD,并且没有内部DTD或内部DTD没有参数实体引用,则独立声明没有任何用处。

以下是使用standalone=yes的实际效果。

  • 如果外部DTD或参数实体引用强制文档包含对未在内部DTD中声明的实体的引用,则会引发错误(参数实体的replace文本不计算在内); ampltgtaposquot是唯一的例外

  • 强制未validation的处理器在忽略参数实体引用之后parsing内部DTD中的标记声明

  • 如果在文档中发现以下任何一种情况,强制处理器将引发错误,并且它们各自的声明位于外部DTD或参数实体replace文本中:

    • 属性与默认值,如果他们没有明确提供他们的价值
    • 实体引用(除了ampltgtaposquot
    • 如果属性的值将通过规范化来修改,则使用标记化types
    • 具有元素内容的元素,如果其内容中出现空白

所有这一切的另外一个方面是,一个没有validation的处理器可能会考虑检索外部DTD,并扩展非独立文档的所有参数实体引用,尽pipe它没有义务这样做。


这里的其他答案不完整或不正确,主要的误解是这样的

独立声明是告诉parsing器忽略DTD中的任何标记声明的一种方式。 此后,DTD仅用于validation。

standalone =“yes”表示XML处理器必须仅使用DTD进行validation。

恰恰相反,将文档声明为独立将实际上迫使非validation处理器parsing它通常必须忽略的内部声明(即在参数实体引用之后的那些声明)。 非validation处理器必须仍然使用内部DTD中的信息来提供默认属性值并标准化标记化属性,因为这与validation无关。