用于"这些元素中的任何一个或者多个,但必须至少一个"的XML模式构造
时间:2020-03-06 14:25:00 来源:igfitidea点击:
我正在尝试建立一个类似于"序列"的架构,其中所有子元素都是可选的,但是必须存在至少一个元素,并且可以有多个元素。
我尝试执行以下操作,但是XMLSpy抱怨"内容模型包含元素<element name =" DateConstant">和<element name =" DateConstant">不能唯一确定的元素。":
<xs:choice> <xs:sequence> <xs:element name="DateConstant"/> <xs:element name="TimeConstant"/> </xs:sequence> <xs:element name="DateConstant"/> <xs:element name="TimeConstant"/> </xs:choice>
可以做到这一点(如果可以的话,如何做到)?
一些澄清:
我只想允许每个具有相同名称的元素之一。可以有一个" DateConstant"和/或者一个" TimeConstant",但不能有两个。
Gizmo的答案符合我的要求,但是对于大量元素来说是不切实际的。
赫斯特的答案允许两个或者多个同名元素,但我不希望这样。
解决方案
试试这个:
<xs:choice> <xs:sequence> <xs:element name="Elem1" /> <xs:element name="Elem2" minOccurs="0" /> <xs:element name="Elem3" minOccurs="0" /> </xs:sequence> <xs:sequence> <xs:element name="Elem2" /> <xs:element name="Elem3" minOccurs="0" /> </xs:sequence> <xs:element name="Elem3" /> </xs:choice>
这样做,我们可以强制选择第一个元素,然后其余部分为可选,第二个元素为可选,其余部分为可选,第三个元素。
我希望这应该做我们想要的。
当然,我们可以将子序列分成几组,以避免在发现每个序列中丢失一个元素时重复这些元素。
根据MSDN上的技术文章标题为了解XML模式
在http://msdn.microsoft.com/zh-cn/library/aa468557.aspx#understandxsd_topic5
我们可以在选择定义(合成器)本身上利用诸如minOccurs之类的约束:
"在合成器上使用出现约束适用于整个组作为一个整体"
(请参阅使用嵌套的复杂类型的更复杂的示例和AuthorType示例)
我们说要求是"至少必须存在一种要素,并且可能存在不止一种"。因此,我建议我们尝试以下方法:
<xs:choice minOccurs="1" maxOccurs="unbounded"> <xs:element name="DateConstant" type="..."/> <xs:element name="TimeConstant" type="..."/> </xs:choice>