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

时间:2008-09-19 12:07:21

标签: xml xsd schema 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>

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

如果邮件用于预订,则它必须包含ReservationGroup组中定义的所有元素。

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

出于某种原因,我的XML编辑器(Eclipse)不喜欢这样,但没有说明原因。它显示该行上有错误&lt; xs:complexType name =“HeaderType”&gt;但没有说出错误是什么

3 个答案:

答案 0 :(得分: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>

可以形成合法选择的群组

<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>

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

<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>

答案 1 :(得分:2)

是。这是因为ReservationGroup和CancellationGroup都有相同的第一个元素 - 一个'reservation-type'元素,在ReservationGroup中固定值为'Reservation',在Cancellationgroup中分别为'Cancellation'。

答案 2 :(得分:1)

这是否有效取决于团体的内容:如果他们是'序列'或'选择'模型组,它是完全合法的; “所有”模型组更有问题,在这种情况下通常不允许。