DTD与XSD定义的XML语言的范围

DTD与XSD定义的XML语言的范围,xml,xsd,dtd,formal-languages,Xml,Xsd,Dtd,Formal Languages,下列主张是否成立: 对于每个DTD,都有一个定义完全相同语言的XSD,对于每个XSD,都有一个定义完全相同语言的DTD。或者换句话说:任何DTD定义的语言集合就是任何XSD定义的语言集合 稍微扩展一下这个问题:XML文档基本上是一个大字符串。语言是字符串的集合。例如,所有MathML文档的(无限)集合是一种语言,所有RSS文档的集合也是一种语言,以此类推。MathML(RSS,…)也是所有XML文档(无限)集合的适当子集。您可以使用DTD或XSD来定义这样的XML子集 现在,每个DTD只定义一种

下列主张是否成立: 对于每个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的程序,以及另一个执行相反操作的程序。我知道有相当多的程序声称可以做到这一点,但我怀疑这是否真的可行。

如果没有限定符,答案是否定的

你必须定义你所谓的“语言”是什么。在我看来,您提到的这些语言是用来定义文档模式的。模式定义了文档结构和内容的约束。XSD可表达的约束远比DTD强大。所以不,他们不会是一样的


比较DTD和XSD可能有助于您理解为什么不能

一个有趣的问题;问得好

答案是“不”,在两个方向

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

<!ELEMENT e (#PCDATA | e)* >
<!ENTITY egbdf "Every good boy deserves favor.">
没有DTD可以成功地接受给定命名空间中的所有且仅接受
e
元素

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

    <xs:schema xmlns:xs="...">
      <xs:element name="e" type="xs:integer"/>
    </xs:schema>
    
    <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>
    
    此架构接受文档
    ,并拒绝文档
    。DTD没有使内容模型依赖于文档实例中给定的属性值的机制

  • XSD通配符允许在指定元素的子元素中包含任意格式良好的XML;最接近DTD的方法是使用
    形式的元素声明,这是不同的,因为它需要对实际出现的所有元素进行声明

  • XSD1.1提供了断言和条件类型分配,在DTD中没有类似物

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

    我认为一个合理的总结是:XSD可以表达DTD可以表达的一切,但实体声明和特殊情况除外,如名称空间声明和xsi:*属性,因为XSD就是为了能够这样做而设计的。因此,在将DTD转换为XSD模式文档时,信息的丢失是相对温和的,是可以很好理解的,并且主要涉及大多数词汇表设计者认为不是实质性兴趣的DTD人工制品

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


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

    听起来像个谜;-)我已经在这个问题上作了一些扩展。我知道XSD更具表现力,但这并不意味着您可以使用它定义无法使用DTD定义的XML格式。@alexraasch,您确实需要查找DTD与XSD的比较。你必须定义你称之为“格式”的东西——这是一种语言能做或不能做的,而不是另一种语言。例如,DTD没有关于名称空间的线索,也没有引用完整性约束,也不能完全反映面向对象的概念或用户定义的类型。。。额外的“表现力”是有原因的;如果这些原因不适用于您的比较研究,那么结果可能会有所不同……(续)即使您将其限制为标记和属性集的定义(这就是您所称的“格式”),您也需要去掉XML名称空间、名称空间和元素范围、基数约束,如[2:5],如果你不能在DTD中定义名称空间,那么这就足以说明DTD和XSD是不等价的。因此,一般来说,您不能编写一个程序来将其中一种类型转换为另一种类型。谢谢Petru。@alexraasch,正是因为这个原因,我(以及其他人)不同意C语言比汇编语言更具表现力。它更简洁;它可能更具启发性;它并没有表现力更强,这一术语通常是在表达能力的比较中定义的:机制A比机制B更具表现力
    <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>