"独立"指令在XML中意味着什么?

Nic*_*ick 255 xml

' standalone'指令在XML文档中意味着什么?

nul*_*ity 192

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

举个例子,考虑一下不起眼的<img>标签.如果查看XHTML 1.0 DTD,您会看到一个标记声明,告诉解析器<img>标记必须是EMPTY并且拥有srcalt属性.当浏览器浏览XHTML 1.0文档并找到<img>标记时,它应该注意到DTD需要srcalt属性,如果它们不存在则添加它们.它也会自动关闭<img>标签,因为它应该是EMPTY.这就是XML规范所指的"标记声明可能会影响文档的内容".然后,您可以使用standalone声明来告诉解析器忽略这些规则.

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

请注意,如果您未指定DTD,则独立声明"没有意义",因此除非您还指定了DTD,否则没有理由使用它.

  • 该示例需要进一步修改."standalone ='no'"通常不会关闭未关闭的XML标记(这是SGML的一个特性,而不是XML的特性).验证将失败.它也不会为必需的属性提供值. (9认同)
  • "独立声明是告诉解析器忽略DTD中任何标记声明的一种方式."这是不正确的.使用`standalone = yes`,不会忽略标记声明,而是会导致文档无效.如果我将其编辑成答案,你介意吗? (2认同)

Rin*_*nke 101

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

来源:独立伪属性仅在使用DTD时才相关

  • 使用standalone ="yes"会导致额外的有效性约束(即可能导致XML文档无效).我把这个编辑成答案,希望没关系. (2认同)
  • @sleske感谢您的贡献.我试图简化你的编辑,同时仍然清楚地说明你的观点.如果我弄错了,请随时再次编辑. (2认同)

Ste*_*rig 20

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

W3C在"可扩展标记语言(XML)1.0(第五版)"中描述了它的用途:


Chr*_*ver 10

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

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

  • 那是什么意思? (12认同)
  • 我倾向于投票,因为这应该以中等QI的普通人可以理解的方式进行. (3认同)

use*_*267 8

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中的信息来提供默认属性值并规范化标记化属性,因为这与验证无关.

  • 最佳答案 (3认同)