在定义XML Schema(XSD)时,"选择"'group'元素是否有效?

Vih*_*ung 9 xml schema xsd choice

定义XML架构(XSD)时是否有"选择"或"组"元素是否有效?

即以下是有效的

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:group ref="ReservationGroup" />
      <xs:group ref="CancellationGroup"/>
    </xs:choice>
  </xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

例如,XML消息可以表示新预留或取消现有预留.

如果消息用于预留,则它必须包括ReservationGroup组中定义的所有元素.

如果是取消,则必须包含CancellationGroup组中定义的所有元素.

出于某种原因,我的XML编辑器(Eclipse)不喜欢这样,但没有说明原因.它显示行<xs:complexType name ="HeaderType">上有错误,但没有说明错误是什么

Dun*_*pen 10

我不是XML专家,虽然我使用它很多.这不是我通常做这种结构的方式.我更喜欢单独的复杂类型而不是两组的选择(参见本答案的最后部分).

我怀疑问题是ReservationGroup和CancellationGroup以相同的元素开头,在这种情况下你将违反Schema Component Constraint:Unique Particle Attribution(下面).

http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/#cos-nonambig

模式组件约束:独特的粒子归因

必须形成内容模型,使得在元素信息项序列的验证期间,可以直接地,间接地或者隐含地包含在其中的粒子组件,其中可以依次确定序列中的每个项目.不检查该项目的内容或属性,也没有关于序列其余部分中的项目的任何信息.

注意:此约束为XML Schema重建[XML 1.0(第二版)]和SGML的等效约束.鉴于元素替换组和通配符的存在,此约束的简明表达很难,请参阅独特粒子归因约束(非规范)(§H)的分析以供进一步讨论.

例如,下面的两个组在同一个选项中是非法的,因为它们的第一个元素是"name",这意味着您无法识别您正在查看的组.但是,ReservationGroup的第一个元素与Cancellation组(resDate和cancDate可能)不同,那么它是有效的.

编辑:我之前从未遇到过这类问题,我认为这些组的定义完全合法是令人着迷的,但如果你把它们放在一个选择中,那么由于每个组的定义,这种选择变得非法.

无法形成合法选择的群组

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>
Run Code Online (Sandbox Code Playgroud)

可以形成合法选择的团体

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="resDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="cancDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>
Run Code Online (Sandbox Code Playgroud)

正如我上面提到的,我会用复杂类型做这类事情.是的,它增加了另一个元素,但它似乎是显而易见的方式,我喜欢显而易见.

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:element name="reservation" type="ReservationType" />
      <xs:element name="cancellation" type="CancellationType" />
    </xs:choice>
  </xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)