我坚持从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>
我得到'元素'电子邮件'的多重定义会导致内容模型变得模棱两可。例外。 我做错了什么?任何需要克服的建议
答案 0 :(得分:1)
DTD内容模型不明确,因此转换器在架构中生成了模糊的内容模型。 DTD和XSD都禁止含糊不清的内容模型。
“歧义”这里是一个技术术语,它意味着当在输入中找到“email”元素时,它无法分辨选择的哪个分支。有各种各样的含糊不清 - 有些可以通过前瞻来解决,有些则不能;但这与此无关。如果您将错误的DTD送入转换器,则会出现错误的架构。
在这种特殊情况下,删除歧义是微不足道的,只需将内容模型更改为
即可<!ELEMENT contact (name+, email, phone+, address?)>
在更一般的情况下,消除歧义是计算机科学中一个难以解决的问题。