在XSD中对两个同名字段使用choice

  • 本文关键字:字段 choice 两个 XSD xml xsd
  • 更新时间 :
  • 英文 :


我可以根据字段的内容做出选择吗?例如,如果答案是肯定的,则会有两个额外的字段-"颜色"one_answers"大小"。这个例子给了我一个错误,因为有两个相同的字段——"答案"。对我来说,解决这个问题的唯一方法是将"答案"放在序列的末尾,但我需要有相同的字段顺序。

<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/>。现在父级的内容模型是

    <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. 对此的一个变体是将"颜色"one_answers"大小"设为"是"的子项,而不是兄弟项。

  3. 第三种选择是完全取消Answer元素。这是完全多余的,因为要么你有颜色和大小(答案是Y),要么你既没有颜色也没有大小(答案为N)。你的问题是,你在执行Answer与其他信息的一致性方面遇到了困难;在几乎任何IT应用程序中,减少一致性强制问题的最简单方法就是减少冗余。为什么要包括那些没有传达实际信息、唯一功能是让你的生活更艰难的东西?

  4. 如果用于读取XML的软件不够智能,无法处理此问题,那么第四个选项是将Answer设置为父元素上的属性,而不是子元素,然后使用XSD 1.1和条件类型赋值根据Answer属性的值为父元素选择类型。

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

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

最新更新