在 XSD 中使用具有 2 个同名字段的选择

Using choice with 2 fields of the same name in XSD

我可以根据字段的内容以某种方式做出选择吗?例如,如果答案是肯定的,则会有 2 个附加字段 - 颜色和尺寸。 这个例子给我错误,因为 2 个相同的字段 - "answer"。对我来说,解决这个问题的唯一方法是将 "answer" 放在序列的末尾,但我需要具有相同的字段顺序。

<xsd:choice>
    <xsd:sequence>
        <xsd:element name="Answer" fixed="N" type="xsd:string"/>
    </xsd:sequence>
    <xsd:sequence>
        <xsd:element name="Answer" fixed="Y" type="xsd:string"/>
        <xsd:element name="Color" type="xsd:string"/>
        <xsd:element name="Size" type="xsd:string"/>
    </xsd:sequence>
</xsd:choice>
  1. 一个解决方案:将<Answer>Y</Answer><Answer>N</Answer>替换为<Yes/><No/>。现在 parent 的内容模型是

    <xsd:choice>
      <xsd:element name="No" type="my:empty"/>
      <xsd:sequence>
        <xsd:element name="Yes" type="my:empty"/>
        <xsd:element name="Color" type="xsd:string"/>
        <xsd:element name="Size" type="xsd:string"/>
      </xsd:sequence>
    </xsd:choice>
    
  2. 对此的一种变体是使颜色和尺寸成为 children of Yes,而不是兄弟姐妹。

  3. 第三种选择是完全消除 Answer 元素。这是完全多余的,因为要么你有颜色和尺寸(答案是 Y),要么你既没有颜色也没有尺寸(答案是 N)。您的问题是您无法确保 Answer 与其他现有信息的一致性;在几乎所有 IT 应用程序中,减少一致性实施问题的最简单方法是减少冗余。为什么要包含不传达实际信息且唯一功能是让您的生活更艰难的东西?

  4. 如果您用来阅读 XML 的软件不够智能,无法处理此问题,那么第四种选择是将 Answer 作为 parent 的一个属性,而不是 child 元素,然后使用 XSD 1.1 和条件类型分配给 select 基于 Answer 属性值的 parent 类型。

  5. 第五种选择是使用 XSD 1.1 和断言来强制执行必要的一致性规则,以保护设计中的冗余。

其中,XML 技能最好的人(根据我的经验)可能会推荐第二个或第三个;那些最少的人似乎喜欢第五个。