【问题标题】:DTD to XSD conversionDTD 到 XSD 的转换
【发布时间】:2012-07-13 09:36:50
【问题描述】:

我坚持使用 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>

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

【问题讨论】:

    标签: xml xsd dtd


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我没有意识到 DTD 无效,它是从受信任的来源和已完成的状态项目中提供的。我现在去检查一下。
    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 2010-12-03
    • 2021-08-27
    • 2014-06-02
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多