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


272

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

Answers:


203

standalone声明是告诉解析器忽略任何标记声明的方式DTD。此后,DTD仅用于验证。

例如,考虑谦虚<img>标签。如果查看XHTML 1.0 DTD,则会看到一个标记声明,告诉解析器<img>标记必须为EMPTY并具有srcalt属性。当浏览器浏览XHTML 1.0文档并找到<img>标签时,它应该注意到DTD要求srcalt属性,如果不存在,则添加它们。由于<img>标签应该是空的,因此也会自动关闭标签。这就是XML规范 “标记声明可能影响文档的内容”的含义。然后,您可以使用该standalone声明来告诉解析器忽略这些规则。

解析器是否实际执行此操作是另一个问题,但是应该符合标准的验证解析器(如浏览器)。

请注意,如果您未指定DTD,则独立声明“没有任何意义”,因此除非您也指定了DTD,否则没有理由使用它。


9
该示例需要进一步修改。具有“ standalone ='no'”通常不会关闭未关闭的XML标签(这是SGML的功能,但不是XML的功能)。验证将失败。它也不会为必需的属性提供值。
khaemuaset

2
“独立声明是一种告诉解析器忽略DTD中任何标记声明的方法。”这是不正确的。使用standalone=yes,不会忽略标记声明,相反,它们会使文档成为无效的XML。您介意我将其编辑为答案吗?
sleske '17

@sleske请进行更改。如果作者不满意,他/她可能会一直回复。
斯蒂芬

@斯蒂芬:谢谢你的鼓励。不幸的是,我不再了解所有XML内容,因此现在不能自信地进行编辑。如果您拥有最新知识,请随时进行编辑:-)。
sleske

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

来源:仅当使用DTD时,独立的伪属性才有意义


2
使用standalone =“ yes”会导致其他有效性约束(即可能导致XML文档无效)。我将此编辑为答案,希望可以。
sleske '17

2
@sleske感谢您的贡献。我试图简化您的编辑,同时仍然清楚地说明您的观点。如果我弄错了,请再次编辑。
Rinke


10

标记声明会影响从XML处理器传递到应用程序的文档内容;示例包括属性默认值和实体声明。独立文档声明(可能显示为XML声明的组成部分)表明是否存在出现在文档实体外部或参数实体中的此类声明。[定义:外部标记声明被定义为在外部子集或参数实体(外部或内部,之内包括了后者,因为不需要验证处理器来读取它们)中的标记声明。

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


12
那是什么意思?
丹·卡特2014年

4
我对此表示反对,因为这应该以中等QI的普通人可以理解的方式进行。
Andrea Silvestri 2014年

8

standalone=yes声明的目的是确保仅基于内部DTD可以忠实地检索文档内部的信息,即,文档可以“独立”,而无需外部引用。验证独立文档可确保未验证的处理器将拥有所有可用于正确解析文档的信息。

如果文档没有外部DTD且内部DTD没有参数实体引用,则独立声明没有任何作用,因为这些文档已经隐式独立。

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

  • 如果文档包含对未在内部DTD中声明的实体的引用,则在使用外部DTD或参数实体引用解析文档时,迫使处理器抛出错误(参数实体的替换文本不需要,因为非验证处理器不需要解析);ampltgtapos,并且quot是唯一的例外

  • 解析未声明为独立的文档时,非验证处理器可以在遇到参数实体引用后立即停止解析内部DTD。将文档声明为独立文档会迫使非验证处理器在内部DTD中解析标记声明,即使它们忽略一个或多个参数实体引用也是如此。

  • 如果在文档中找到以下任何内容,并且它们的相应声明在外部DTD或参数实体替换文本中,则强制验证处理器抛出错误:

    • 具有默认值的属性(如果未明确提供其值)
    • 实体引用(比其他ampltgtapos,和quot
    • 具有标记化类型的属性,如果可以通过规范化修改属性的值
    • 具有元素内容的元素,如果其内容中出现空白

即使没有义务,非验证处理器也可以考虑检索外部DTD并为非独立文档扩展所有参数实体引用,即standalone=yes,从理论上讲,设置可以提高非验证处理器的性能(破坏者警报:它可能不会有所作为)。


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

独立声明是一种告诉解析器忽略DTD中任何标记声明的方法。此后,DTD仅用于验证。

standalone =“ yes”表示XML处理器必须将DTD仅用于验证。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.