它是有效的定义XML模式时具有“组”元素的“选择”(XSD)(Is it valid to have

2019-07-28 22:32发布

是它的有效成具有“选择”或定义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中)不喜欢这样,但并不说明为什么。 这表明有是上线的误差<XS:复杂类型名称=“HeaderType”>,但并没有说是什么错误

Answer 1:

我不是专家XML,虽然我用它了不少。 这不是我通常会做这种结构的方式。 我宁愿一个单独的复合类型而不是两个组的选择(见这个答案的尽头)。

我怀疑的问题是,ReservationGroup和CancellationGroup有相同的元素,在这种情况下,你会违反架构组件的约束开始:唯一粒子属性(如下图)。

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

架构组件约束:唯一粒子属性

该·元素信息项序列的验证·期间,粒子成分直接包含,间接或·隐·在其中与以尝试·验证·反过来序列中的每个项目都可以被唯一确定的内容模型必须被形成为使得但是并没有对内容或项目的属性,并没有关于在序列的其余项目的任何信息。

注意:此约束重建XML模式[XML 1.0(第二版)和SGML的等效约束。 给定的元素的取代基和通配符的存在下,该约束的简洁的表达是困难的,请参阅唯一粒子属性约束(非标准化)(§H)进一步讨论的分析。

例如,下面的两个组都在同样的选择非法的,因为他们的每一个第一个元素是“姓名”,这意味着你不能确定你在看哪个组。 然而是ReservationGroup的第一个元素是从取消组(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>


Answer 2:

是。 这是因为无论是ReservationGroup和CancellationGroup具有相同的第一元件 - 分别与所述ReservationGroup“预约”和在Cancellationgroup“取消”的一个固定值的“预约式”元素。



Answer 3:

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



文章来源: Is it valid to have a 'choice' of 'group' elements when defining an XML Schema (XSD)