它是有效的,有一个"选择"或"分组"的要素时限定XML模式(文件)

即是的以下有效

<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编辑(蚀)不喜欢这个,但没有说明为什么。它显示了有一个错误就行 <xs:complexType name="HeaderType"> 但不会说什么的错误

有帮助吗?

解决方案

我没有XML专家,虽然我用它相当多的。这不是我通常做这种结构。我会更喜欢一个独立的复杂的类型,而不是一个选择两个组(见的最后这个答复).

我怀疑这个问题是,ReservationGroup和CancellationGroup开始与相同的元素,在这种情况下你会违反的模式组件的约束:唯一颗粒归属(见下文)。

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

模式组件的约束:唯一的 颗粒归属

一个内容模型 必须形成这样过 ·验证·的一个元素的信息 项目的顺序,粒子组成 包含直接、间接或 ·隐含·其中哪 试图·验证·每个项目 顺序反过来可以唯一 确定没有检查 内容或特性的项目, 没有任何有关的信息 项目的剩余部分 序列。

注: 这种约束 重建XML模式的 相当的限制[1.0XML (第二版)]和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>

其他提示

是的。这是因为这两个ReservationGroup和CancellationGroup有同样的第一个元素-a'的保留类型的'元的固定价值的'保留'在ReservationGroup和'消除'在Cancellationgroup分别。

这是否有效取决于内容的组:如果他们是'序'或"选择"模式团体,这是完全合法的;"所有"模型团更大的问题,一般不允许在这种情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top