2

我有一个 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>

这解决了我所有的问题。谢谢!

4

1 回答 1

2

这是模棱两可的,因为minOccurs="0". 如果验证器找到一个preamble元素,它是第一个选择的第一个元素,还是第二个选择的第二个title元素并且缺少该元素?

于 2010-04-09T22:45:05.890 回答