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>

「要素 'email' の複数の定義により、コンテンツ モデルがあいまいになります。」例外。私は何を間違っていますか?克服するための提案

4

1 に答える 1

1

DTD コンテンツ モデルがあいまいであるため、コンバーターはスキーマ内にあいまいなコンテンツ モデルを生成しました。DTD と XSD はどちらも、あいまいなコンテンツ モデルを禁止しています。

ここでの「あいまいさ」は専門用語で、入力に「email」要素が見つかった場合に、どのブランチを選択するか判断できないことを意味します。あいまいさにはさまざまな種類があります。先読みによって解決できるものもあれば、できないものもあります。しかし、それはここでは関係ありません。不適切な DTD をコンバーターに入力すると、不適切なスキーマが出力されます。

この特定のケースでは、あいまいさを取り除くのは簡単です。コンテンツ モデルを次のように変更するだけです。

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

より一般的なケースでは、あいまいさを取り除くことは、コンピューター サイエンスでは難しい (しかし解決済みの) 問題です。

于 2012-07-13T16:42:21.660 に答える