在XSD中使用2个同名字段的选项

时间:2015-02-20 12:43:35

标签: xml xsd

我能以某种方式根据该领域的内容做出选择吗?例如,如果答案是肯定的,则会有2个附加字段 - 颜色和大小。 这个例子给我错误,因为2个相同的字段 - "回答"。对我来说,唯一能解决的问题就是放置"回答"在序列的最后,但我需要具有相同的字段顺序。

<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 个答案:

答案 0 :(得分:3)

  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. 对此的一个变体是使Color和Size成为Yes的子项,而不是兄弟姐妹。

  3. 第三种选择是完全消除Answer元素。它完全是多余的,因为你有颜色和大小(答案是Y)或你既没有颜色也没有尺寸(答案是N)。您的问题是您在使用其他信息强制执行A​​nswer的一致性时遇到问题;在几乎任何IT应用程序中,减少一致性执行问题的最简单方法是减少冗余。为什么要包含不传达实际信息的东西,其唯一的功能是让你的生活更难?

  4. 如果您用来阅读XML的软件不够智能,无法处理这个问题,那么第四个选项就是在父级而不是子元素上使用Answer属性,然后使用XSD 1.1和条件类型赋值,根据Answer属性的值选择父类型。

  5. 第五个选项是使用XSD 1.1和断言来强制执行保护设计冗余所需的一致性规则。

  6. 其中,具有最佳XML技能的人(根据我的经验)可能推荐第二或第三;那些最不常见的人似乎喜欢第五个。