【问题标题】:Scope of XML languages defined by DTD vs XSDDTD 与 XSD 定义的 XML 语言的范围
【发布时间】:2013-11-10 02:18:16
【问题描述】:

下列命题是否成立: 对于每个 DTD,都有一个定义完全相同语言的 XSD,对于每个 XSD,都有一个定义完全相同语言的 DTD。或者换一种说法:任何 DTD 定义的语言集合正是任何 XSD 定义的语言集合?

稍微扩展一下这个问题:XML 文档基本上是一个大字符串。语言是字符串的集合。例如,所有 MathML 文档的(无限)集合是一种语言,所有 RSS 文档的集合也是如此,等等。 MathML (RSS, ...) 也是所有 XML 文档的(无限)集合的真子集。您可以使用 DTD 或 XSD 来定义这样的 XML 子集。

现在,每个 DTD 都只定义一种语言。但是,如果您考虑所有可能的 DTD,就会得到一组语言。我的问题是,这个集合是否与您从所有可能的 XSD 中获得的集合完全相同?如果是这样,那么 DTD 和 XSD 是等价的,因为它们定义的 XML 语言的范围是相等的。

为什么这个问题很重要?如果 DTD 和 XSD 都是等价的,那么可以编写一个程序,将 DTD 作为输入并为您提供等价的 XSD,而另一个程序则相反。我知道有很多程序声称可以做到这一点,但我怀疑这是否真的可能。

【问题讨论】:

  • 听起来像个谜 ;-)

标签: xml xsd dtd formal-languages


【解决方案1】:

一个有趣的问题;问得好!

答案都是“不”,双向。

这是一个在 XSD 中没有等效的 DTD:

<!ELEMENT e (#PCDATA | e)* >
<!ENTITY egbdf "Every good boy deserves favor.">

此 DTD 接受的字符序列集包括 &lt;e/&gt;&lt;e&gt;&amp;egbdf;&lt;/e&gt;,但不包括 &lt;e&gt;&amp;beadgcf;&lt;/e&gt;

由于 XSD 验证在一个信息集上运行,其中所有实体都已展开,因此没有任何 XSD 架构可以区分第三种情况和第二种情况。

DTD 可以表达 XSD 中无法表达的约束的第二个领域涉及 NOTATION 类型。我不会举例;细节太复杂了,我不查就无法正确记住它们,而且不够有趣,让我想这样做。

第三个方面:DTD 以相同的方式处理命名空间属性(也称为命名空间声明)和一般属性;因此,DTD 可以限制名称空间声明在文档中的出现。 XSD 架构不能。这同样适用于 xsi 命名空间中的属性。

如果我们忽略所有这些问题,并仅针对不包含对命名实体的引用的字符序列制定问题,而不是预定义实体 ltgt 等,那么答案就会改变:对于每个不涉及 NOTATION 声明的 DTD,都有一个 XSD 模式,它在实体扩展后接受完全相同的文档集,并且以忽略命名空间属性和 xsi 命名空间中的属性的方式定义了“相同”。

在另一个方向上,不同的领域包括:

  • XSD 是命名空间感知的:以下 XSD 模式接受指定目标命名空间中元素 e 的任何实例,而不管文档实例中绑定到该命名空间的前缀是什么。

    <xs:schema xmlns:xs="..." targetNamespace="http://example.com/nss/24397">
      <xs:element name="e" type="xs:string"/>
    </xs:schema>
    

    没有 DTD 可以成功接受所有且仅接受给定命名空间中的 e 元素。

  • XSD 具有更丰富的数据类型集,可以使用数据类型来约束元素和属性。以下 XSD 架构没有等效的 DTD:

    <xs:schema xmlns:xs="...">
      <xs:element name="e" type="xs:integer"/>
    </xs:schema>
    

    此架构接受文档&lt;e&gt;42&lt;/e&gt;,但不接受文档&lt;e&gt;42d Street&lt;/e&gt;。没有 DTD 可以做出这种区分,因为 DTD 没有限制 #PCDATA 内容的机制。最接近的 DTD 是 &lt;!ELEMENT e (#PCDATA)&gt;,它接受两个示例文档。

  • XSD 的xsi:type 属性允许在文档内修改内容模型。以下架构文档描述的 XSD 架构没有等效的 DTD:

    <xs:schema xmlns:xs="...">
      <xs:complexType name="e">
        <xs:sequence>
          <xs:element ref="e" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="e2">
        <xs:sequence>
          <xs:element ref="e" minOccurs="2" maxOccurs="2"/>
        </xs:sequence>
      </xs:complexType>
    
      <xs:element name="e" type="e"/>
    </xs:schema>
    

    此架构接受文档 &lt;e xmlns:xsi="..." xsi:type="e2"&gt;&lt;e/&gt;&lt;e/&gt;&lt;/e&gt; 并拒绝文档 &lt;e xmlns:xsi="..." xsi:type="e2"&gt;&lt;e/&gt;&lt;e/&gt;&lt;e/&gt;&lt;/e&gt;。 DTD 没有使内容模型依赖于文档实例中给定的属性值的机制。

  • XSD 通配符允许在指定元素的子元素中包含任意格式良好的 XML;最接近 DTD 的方法是使用 &lt;!ELEMENT e ANY&gt; 形式的元素声明,这不一样,因为它需要声明所有实际出现的元素。

  • XSD 1.1 提供了断言和条件类型分配,这在 DTD 中没有类似物。

XSD 的表达能力可能在其他方面超过了 DTD,但我认为这一点已经得到充分说明。

我认为一个公平的总结是:XSD 可以表达 DTD 可以表达的一切,除了实体声明和特殊情况,如命名空间声明和 xsi:* 属性,因为 XSD 被设计为能够这样做。因此,将 DTD 转换为 XSD 模式文档时的信息丢失相对较少,易于理解,并且主要涉及大多数词汇设计者认为没有实质性意义的 DTD 人工制品。

XSD 可以表达比 DTD 更多的内容,这也是因为 XSD 就是为此而设计的。在一般情况下,从 XSD 到 DTD 的翻译必然涉及信息丢失(接受的文档集可能需要更大或更小,或者是重叠集)。关于如何管理信息丢失可以做出不同的选择,这就产生了一个问题:“如何最好地将 XSD 转换为 DTD 形式?”一定的理论兴趣。 (然而,在实践中似乎很少有人觉得这是一个有趣的问题。)

正如您的问题一样,所有这些都集中在作为字符序列的文档、作为文档集的语言以及作为这种意义上的语言生成器的模式语言上。模式中存在的可维护性和信息问题不会变成文档集扩展中的差异(例如,文档模型中的类层次结构的处理)被忽略了。

【讨论】:

  • 非常感谢您的详尽回答。这正是我正在寻找的答案。
【解决方案2】:

没有限定词,答案是否定的。

你必须定义你称之为“语言”的东西。在我看来,您所指的这些语言是用于定义文档模式的语言。模式定义了对文档结构和内容的约束。 XSD 可表达的约束远比 DTD 强大。所以不,他们不会是一样的。

DTD 与 XSD 的比较可能有助于您理解为什么不这样做。

【讨论】:

  • 我对这个问题进行了一些扩展。我知道 XSD 更具表现力,但这并不一定意味着您可以使用它来定义使用 DTD 无法定义的 XML 格式。
  • @alexraasch,您确实需要查找 DTD 与 XSD 的比较。你必须定义你称之为“格式”的东西——它是一种语言可以或不能做的,与另一种语言相比。例如,DTD 对命名空间没有任何线索,也没有参照完整性约束,也没有能力完全反映面向对象的概念或用户定义的类型……额外的“表现力”是有原因的;如果这些原因不适用于您的比较研究,那么结果可能会有所不同......
  • (续)即使您将其限制为标签和属性集的定义(这就是您所说的“格式”吗?),您也需要去掉 XML 命名空间、命名空间和元素范围、基数约束(例如 [2:5] 等)表示它们是相同的。
  • 好吧,如果您不能在 DTD 中定义名称空间,那么这足以说明 DTD 和 XSD 不等价。因此,一般来说,您不能编写将任何一种类型转换为另一种类型的程序。谢谢佩特鲁。
  • @alexraasch,正是出于这个原因,我(以及其他人)不同意 C 比汇编语言更具表现力。它更简洁;它可能更具暗示性;它并不更具表现力,因为该术语通常在比较表现力时定义:如果 B 可表达的所有事物也可以由 A 表达,反之亦然,则机制 A 比机制 B 更具表现力。您可以按照自己的意愿使用词语,但如果您希望理解并被理解,则需要采用标准技术术语的标准技术意义。
猜你喜欢
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
相关资源
最近更新 更多