我能以某种方式根据该领域的内容做出选择吗?例如,如果答案是肯定的,则会有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>
答案 0 :(得分:3)
一种解决方案:将<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>
对此的一个变体是使Color和Size成为Yes的子项,而不是兄弟姐妹。
第三种选择是完全消除Answer元素。它完全是多余的,因为你有颜色和大小(答案是Y)或你既没有颜色也没有尺寸(答案是N)。您的问题是您在使用其他信息强制执行Answer的一致性时遇到问题;在几乎任何IT应用程序中,减少一致性执行问题的最简单方法是减少冗余。为什么要包含不传达实际信息的东西,其唯一的功能是让你的生活更难?
如果您用来阅读XML的软件不够智能,无法处理这个问题,那么第四个选项就是在父级而不是子元素上使用Answer属性,然后使用XSD 1.1和条件类型赋值,根据Answer属性的值选择父类型。
第五个选项是使用XSD 1.1和断言来强制执行保护设计冗余所需的一致性规则。
其中,具有最佳XML技能的人(根据我的经验)可能推荐第二或第三;那些最不常见的人似乎喜欢第五个。