我正在尝试设置一个类似于“序列”的模式的一部分,其中所有子元素都是可选的,但至少有一个元素必须存在,并且可能还有更多元素比其中一个。
我尝试执行以下操作,但XMLSpy抱怨“内容模型包含元素&lt; element name =”DateConstant“&gt;和&lt; element name =”DateConstant“&gt;这些不能唯一确定。”:< / p>
<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的答案符合我的要求,但对于大量元素来说这是不切实际的。 赫斯特的回答允许两个或多个同名的元素,我不想要。
答案 0 :(得分:23)
试试这个:
<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>
这样做,你强制要么选择第一个元素,然后其余的是可选的,要么第二个元素,其余的是可选的,要么是第三个元素。
这应该做你想要的,我希望。
当然,您可以将子序列放入组中,以避免在您意识到错过一个元素时复制每个序列中的元素。
答案 1 :(得分:17)
根据MSDN上标题为了解XML架构的技术文章 在http://msdn.microsoft.com/en-us/library/aa468557.aspx#understandxsd_topic5 您可以在选择定义(compositor)本身上利用 minOccurs 等约束:
“在合成器上使用出现约束适用于整个组”
(参见使用嵌套复杂类型和AuthorType示例的更复杂的示例)
你说你的要求是“至少有一个元素必须存在,并且可能有不止一个”。因此,我建议你尝试以下方法:
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="DateConstant" type="..."/>
<xs:element name="TimeConstant" type="..."/>
</xs:choice>
答案 2 :(得分:2)
@hurst,
很遗憾,您无法理解原始问题。当包含minOccurs =“0”的所有元素作为选项时,将自动满足对选项放置minOccurs =“1”。
因此,您未能解释原始海报所要求的“至少一个”,因为没有任何元素正确地满足两个完全可选元素的出现。
到目前为止,我无法找到解决方案,因为minOccur / maxOccur都与定义它们的组相关,并且与节点的总数无关。你也不能使用choice元素多次定义同一个命名元素,或者它变得“含糊不清”。我已经看到一些示例使用引用而不是特定类型的元素,但我相信这会使microsoft XSD解析器失败。
<xs:choice minOccurs="1" maxOccurs="1">
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="Elem1" minOccurs="1" maxOccurs="1" />
<xs:element name="Elem2" minOccurs="0" maxOccurs="1" />
</xs:sequence>
<xs:sequence >
<xs:element name="Elem2" minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:choice>
在这里你可以看到你有第一个序列(必须有Elem1但可以选择Elem2),或者你有第二个序列(必须有Elem2)。
因此,您现在拥有这两个元素中的“任何一个或多个”。当然,由于您需要为所有可能的组合提供额外的选择,因此您获得的选项会越来越复杂。