代码之家  ›  专栏  ›  技术社区  ›  Vihung

在定义XML架构(XSD)时,可以“选择”“组”元素吗

  •  10
  • Vihung  · 技术社区  · 17 年前

    在定义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组中定义的所有元素。

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

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

    2 回复  |  直到 3 年前
        1
  •  9
  •   Dunderklumpen    17 年前

    我不是XML专家,尽管我经常使用它。这不是我通常做这种结构的方式。我更喜欢单独的复杂类型,而不是两组的选择(见这个答案的末尾)。

    我怀疑问题在于ReservationGroup和CancellationGroup以相同的元素开头,在这种情况下,您将违反模式组件约束:唯一粒子属性(见下文)。

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

    架构组件约束:唯一 粒子归因

    内容模型 必须形成这样的结构,即在 ·元素信息的验证 粒子组件的项目序列 直接、间接或 ·隐含地·其中 尝试验证 序列可以是唯一的 未经检查而确定 该项目的内容或属性, 并且没有任何关于 其余项目 序列。

    注: 此约束 为XML模式重建 [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>
    
        2
  •  2
  •   Vihung    17 年前

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

        3
  •  1
  •   mdb    17 年前