我有一个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/>
元素上发出以下警告,它会抛弃所有内容:
元素'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 :(得分:1)
由于minOccurs="0"
,这是不明确的。如果验证器找到preamble
元素,它是第一个选择的第一个元素,还是第二个选择的第二个元素,而title
元素丢失了?