2010-04-09 22 views
2

我有一個XSD,它是從RELAX NG架構轉換而來的,我嘗試修復一些錯誤。最大的問題我有它具有以下XSD序列顯示爲不明確!

<xs:element name="list"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:choice> 
      <xs:sequence> 
      <xs:element minOccurs="0" ref="preamble"/> 
      <xs:element minOccurs="0" ref="title"/> 
      </xs:sequence> 
      <xs:sequence> 
      <xs:element minOccurs="0" ref="title"/> 
      <xs:element minOccurs="0" ref="preamble"/> 
      </xs:sequence> 
     </xs:choice> 
     <xs:group maxOccurs="unbounded" ref="block-selectionListItem"/> 
     </xs:sequence> 
     <xs:attributeGroup ref="attlist-selectionList"/> 
    </xs:complexType> 
    </xs:element> 

正如你所看到的xs:選擇塊可以兩個X之間挑:序列塊。似乎有意義,但Visual Studio在第二個將所有內容都丟掉的<xs:element minOccurs="0" ref="title/>元素上發出以下警告:

元素「標題」的多重定義會導致內容模型變得模糊不清。內容模型必須被形成爲使得在元素信息項序列的驗證期間,直接地,間接或隱含地包含在其中以試圖驗證序列中的每個項目的粒子可以被唯一地確定而不檢查內容或屬性該項目,並且沒有關於序列剩餘部分中的項目的任何信息。

因爲你只能選擇一個我不明白這是如何含糊不清。任何幫助將不勝感激!

答:

正如指出了下面的答案,我不考慮所有的可能性。所以這是我必須做的:

<xs:element name="list"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:group minOccurs ="0" maxOccurs="1" ref ="list-titlePreambleChoice"/> 
     <xs:group maxOccurs="unbounded" ref="block-basicListItem"/> 
     </xs:sequence> 
     <xs:attributeGroup ref="attlist-basicList"/> 
    </xs:complexType> 
    </xs:element> 

這解決了我的所有問題。謝謝!

+0

Tim。我正在嘗試做類似的事情(請參閱http://stackoverflow.com/questions/14321579/how-to-make-a-schema-for-an-unordered-list-where-some-occur-once-some-many -時間)。您可以發佈您的解決方案的整個XSD,以便我可以看到您是如何做到的。 – Dave 2013-01-31 17:01:00

回答

2

由於minOccurs="0",這是不明確的。如果驗證程序發現preamble元素,它是第一個選擇的第一個元素,還是第二個元素的第二個元素,並且title元素缺失?

+0

我想跟隨但仍然有點失落。我添加了一個包含可能的XML輸出的更多細節的新編輯。這有意義嗎? – 2010-04-09 23:00:31

+0

AHA!我現在明白了,謝謝你說的話!當然,我沒有考慮過所有的情況。謝謝! – 2010-04-09 23:34:32