0

我坚持从 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>

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

4

1 回答 1

1

DTD 内容模型不明确,因此转换器在模式中生成了不明确的内容模型。DTD 和 XSD 都禁止模棱两可的内容模型。

这里的“歧义”是一个技术术语,它意味着当在输入中找到一个“电子邮件”元素时,它无法判断该选择的哪个分支。有不同种类的歧义——有些可以通过前瞻来解决,有些则不能;但这在这里无关紧要。如果您将错误的 DTD 输入转换器,您将得到一个错误的模式。

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

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

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

于 2012-07-13T16:42:21.660 回答