我可以根据字段的内容做出选择吗?例如,如果答案是肯定的,则会有两个额外的字段-"颜色"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>
-
一种解决方案:将
<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>
-
对此的一个变体是将"颜色"one_answers"大小"设为"是"的子项,而不是兄弟项。
-
第三种选择是完全取消Answer元素。这是完全多余的,因为要么你有颜色和大小(答案是Y),要么你既没有颜色也没有大小(答案为N)。你的问题是,你在执行Answer与其他信息的一致性方面遇到了困难;在几乎任何IT应用程序中,减少一致性强制问题的最简单方法就是减少冗余。为什么要包括那些没有传达实际信息、唯一功能是让你的生活更艰难的东西?
-
如果用于读取XML的软件不够智能,无法处理此问题,那么第四个选项是将Answer设置为父元素上的属性,而不是子元素,然后使用XSD 1.1和条件类型赋值根据Answer属性的值为父元素选择类型。
-
第五种选择是使用XSD 1.1和断言来强制执行必要的一致性规则,以保护设计中的冗余。
其中,那些拥有最佳XML技能的人(根据我的经验)可能会推荐第二种或第三种;那些次数最少的人似乎喜欢第五个。