我有一个 XSD,它是从 RELAX NG 模式转换而来的,有一些我正在尝试修复的错误。我遇到的最大问题是
<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:choice 块允许您在两个 xs:sequence 块之间进行选择。似乎是有道理的,除了 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>
这解决了我所有的问题。谢谢!