如果 XML 声明和 DTD 都是 XML 文档的有效性和格式良好的先决条件,那么它们如何在规范中成为可选的?

How can both XML declaration and DTD be optional in the spec if they are both prerequisites to validity and well-formedness of an XML document?

经过the latest XML 1.0 specification,一个XML文档的定义如下:

[1]     document       ::=      prolog element Misc*
...
[22]    prolog         ::=      XMLDecl? Misc* (doctypedecl Misc*)?
[23]    XMLDecl        ::=      '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
...

[28]    doctypedecl    ::=      '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'

规范指出

document type declaration 的定义有两个格式正确的约束和一个有效性约束,因此如果省略它,则 XML 文档不能被视为有效。

里面有a minimal XML document example

<?xml version="1.0"?>
<greeting>Hello, world!</greeting>

我明白为什么它格式正确但无效,但它仍然没有解释如果 XML 文档有效,DTD 是可选的。


这个问题的背景

开始阅读 XML spec because wanted to get a better understanding before getting into DocBook 5 but it's manual states that "DocBook V5.0 is thus defined using a powerful schema language called RELAX NG" so it "does not depend on DTDs anymore", and the example shown 也完全省略了 DTD。

W3C XML 建议只定义了一种类型的 XML 模式:DTD。其他存在:XSD、Relax NG 和 Schematron 是其他 XML 模式。事实上,DTD 很少用于定义现代 XML 模式,因为它的表达能力有限。

有效性的概念已经扩展到适用于所有 XML 模式:XML 文档被认为是 有效 [=29] =] 模式,如果它遵守模式定义的语法和内容约束。

  • DTD 可以省略,原因与 XML 文档需要相同 不与任何 XML 模式相关联:遵守规则 格式良好通常足以满足应用程序的需求。
  • 可以省略 XML 声明,因为它的值是默认值 足以支持整个结构良好的规则 建议的其余部分。

另见

  • Is there any difference between 'valid xml' and 'well formed xml'?

explain how the DTD can be optional if it is required for an XML document to be valid.

嗯,有效性是可选的,因此 DTD 是可选的。

我认为您对“有效”一词的理解过多。让我们假设他们不称其为“有效性”,而是称其为“可爱”。如果一个文档有 DTD 并且匹配该 DTD 中定义的规则,那么它就是可爱的。并非所有文件都很可爱;可爱是可选的,因此 DTD 是可选的。

关于 DocBook 和 RelaxNG 的最后一段。 XML 规范中 defined/described 的有效性表示基于 DTD 的有效性。有效性的更广泛扩展概念允许使用 DTD 以外的约束语言定义文档结构,例如 XSD 或 RelaxNG。没有 Doctype/DTD 的文档在 XML 规范的狭义意义上是无效的,但在允许替代模式语言的更广泛意义上是有效的。