DTD与XSD定义的XML语言的范围
下列主张是否成立: 对于每个DTD,都有一个定义完全相同语言的XSD,对于每个XSD,都有一个定义完全相同语言的DTD。或者换句话说:任何DTD定义的语言集合就是任何XSD定义的语言集合 稍微扩展一下这个问题:XML文档基本上是一个大字符串。语言是字符串的集合。例如,所有MathML文档的(无限)集合是一种语言,所有RSS文档的集合也是一种语言,以此类推。MathML(RSS,…)也是所有XML文档(无限)集合的适当子集。您可以使用DTD或XSD来定义这样的XML子集 现在,每个DTD只定义一种语言。但是如果你考虑所有可能的DTD,你会得到一组语言。我的问题是,这个集合是否与您从所有可能的XSD获得的集合完全相同?如果是这样的话,那么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都是等效的,那么就可以编写一个以DTD为输入并提供等效XSD的程序,以及另一个执行相反操作的程序。我知道有相当多的程序声称可以做到这一点,但我怀疑这是否真的可行。如果没有限定符,答案是否定的 你必须定义你所谓的“语言”是什么。在我看来,您提到的这些语言是用来定义文档模式的。模式定义了文档结构和内容的约束。XSD可表达的约束远比DTD强大。所以不,他们不会是一样的
比较DTD和XSD可能有助于您理解为什么不能 一个有趣的问题;问得好 答案是“不”,在两个方向 这是一个在XSD中没有等效项的DTD:
<!ELEMENT e (#PCDATA | e)* >
<!ENTITY egbdf "Every good boy deserves favor.">
没有DTD可以成功地接受给定命名空间中的所有且仅接受e
元素
<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更具表现力,但这并不意味着您可以使用它定义无法使用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>