Xml DTD到XSD的转换

Xml DTD到XSD的转换,xml,xsd,dtd,Xml,Xsd,Dtd,我坚持从DTD进行以下转换: <!ELEMENT contact (name+, ((email | phone+) | (email, phone+)), address?)> 至XSD: <xs:element name="contact"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="name"/> <x

我坚持从DTD进行以下转换:

<!ELEMENT contact (name+, ((email | phone+) | (email, phone+)), address?)>

至XSD:

<xs:element name="contact">
<xs:complexType>
  <xs:sequence>
    <xs:element maxOccurs="unbounded" ref="name"/>
    <xs:choice>
      <xs:choice>
        <xs:element ref="email"/>
        <xs:element maxOccurs="unbounded" ref="phone"/>
      </xs:choice>
      <xs:sequence>
<!-- Next line causes exception -->
        <xs:element ref="email"/>
        <xs:element maxOccurs="unbounded" ref="phone"/>
      </xs:sequence>
    </xs:choice>
    <xs:element minOccurs="0" ref="address"/>
  </xs:sequence>
</xs:complexType>

我得到“元素‘email’的多个定义导致内容模型变得模糊。”异常。
我做错了什么?任何克服DTD内容模型的建议都是不明确的,因此转换器在模式中生成了不明确的内容模型。DTD和XSD都禁止不明确的内容模型

“歧义”在这里是一个技术术语,它意味着当在输入中发现“email”元素时,它无法判断选择哪个分支。有不同类型的歧义-一些可以通过前瞻解决,其他不能;但这在这里无关紧要。如果您将一个坏的DTD馈送到转换器中,您将得到一个坏的模式

在这种特殊情况下,消除歧义很简单,只需将内容模型更改为

<!ELEMENT contact (name+, email, phone+, address?)>


在更一般的情况下,消除歧义是计算机科学中一个困难(但已解决)的问题。

我没有意识到DTD是无效的,它是从可信的来源和已完成的国家项目中提供的。我现在要检查一下。