XML中的“独立”指令是什么意思?
XML文档中的“ standalone
”指令是什么意思?
standalone
声明是告诉parsing器忽略DTD中的任何标记声明的一种方式。 此后,DTD仅用于validation。
作为一个例子,考虑一下谦虚的<img>
标签。 如果您查看XHTML 1.0 DTD ,则会看到一个标记声明,告诉parsing器<img>
标记必须是EMPTY,并具有src
和alt
属性。 当浏览器浏览XHTML 1.0文档并find<img>
标签时,应该注意到DTD需要src
和alt
属性,如果它们不存在,就添加它们。 它也会自动closures<img>
标签,因为它应该是EMPTY。 这是XML规范的意思,即“标记声明可以影响文档的内容”。 然后,您可以使用standalone
声明来告诉parsing器忽略这些规则。
无论你的parsing器是否真的这样做是另一个问题,但一个符合标准的validationparsing器(如浏览器)应该。
请注意,如果您不指定DTD,则独立声明“没有意义”,所以除非您还指定DTD,否则没有理由使用它。
- 独立指令是XML声明中的可选属性。
- 有效值为
yes
和no
,其中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处理器来读取它们)。]
standalone=yes
声明的目的是保证文档内的信息能够仅仅基于内部DTD被忠实地检索,即文档可以“独立”而不需要外部参考。 validation独立文档可确保validation和未validation的处理器将提供完全相同的信息。
如果文档没有外部DTD,并且没有内部DTD或内部DTD没有参数实体引用,则独立声明没有任何用处。
以下是使用standalone=yes
的实际效果。
-
如果外部DTD或参数实体引用强制文档包含对未在内部DTD中声明的实体的引用,则会引发错误(参数实体的replace文本不计算在内);
amp
,lt
,gt
,apos
和quot
是唯一的例外 -
强制未validation的处理器在忽略参数实体引用之后parsing内部DTD中的标记声明
-
如果在文档中发现以下任何一种情况,强制处理器将引发错误,并且它们各自的声明位于外部DTD或参数实体replace文本中:
- 属性与默认值,如果他们没有明确提供他们的价值
- 实体引用(除了
amp
,lt
,gt
,apos
和quot
) - 如果属性的值将通过规范化来修改,则使用标记化types
- 具有元素内容的元素,如果其内容中出现空白
所有这一切的另外一个方面是,一个没有validation的处理器可能会考虑检索外部DTD,并扩展非独立文档的所有参数实体引用,尽pipe它没有义务这样做。
这里的其他答案不完整或不正确,主要的误解是这样的
独立声明是告诉parsing器忽略DTD中的任何标记声明的一种方式。 此后,DTD仅用于validation。
standalone =“yes”表示XML处理器必须仅使用DTD进行validation。
恰恰相反,将文档声明为独立将实际上迫使非validation处理器parsing它通常必须忽略的内部声明(即在参数实体引用之后的那些声明)。 非validation处理器必须仍然使用内部DTD中的信息来提供默认属性值并标准化标记化属性,因为这与validation无关。