DTD到XSD的转换

时间:2012-07-13 14:07:23

标签: 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"/>
    <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>

我得到'元素'电子邮件'的多重定义会导致内容模型变得模棱两可。例外。 我做错了什么?任何需要克服的建议

1 个答案:

答案 0 :(得分:1)

DTD内容模型不明确,因此转换器在架构中生成了模糊的内容模型。 DTD和XSD都禁止含糊不清的内容模型。

“歧义”这里是一个技术术语,它意味着当在输入中找到“email”元素时,它无法分辨选择的哪个分支。有各种各样的含糊不清 - 有些可以通过前瞻来解决,有些则不能;但这与此无关。如果您将错误的DTD送入转换器,则会出现错误的架构。

在这种特殊情况下,删除歧义是微不足道的,只需将内容模型更改为

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

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

相关问题