2012-07-13 51 views
0

我堅持了從DTD下面的轉換:DTD到XSD轉換

<!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

的DTD內容模型是模糊的,所以轉換器產生了架構中的模糊的內容模型。 DTD和XSD都禁止模糊的內容模型。

「歧義」這裏是一個技術術語,這意味着當在輸入中找到「email」元素時,它不能分辨要選擇哪個分支。有不同種類的歧義 - 有些可以通過前瞻來解決,有些則不能;但這在這裏無關緊要。如果您將錯誤的DTD提供給轉換器,您將得到一個錯誤的模式。

在這種特殊情況下,消除模糊性是微不足道的,只是改變了內容模型

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

在更一般的情況下,消除歧義是在計算機科學方面的困難(但解決)問題。

+0

謝謝邁克爾。 – 2012-07-14 15:29:47

+0

我沒有意識到DTD是無效的,它來自可信來源和完成狀態項目。 我現在要檢查它。 – 2012-07-14 15:46:44