我正在尝试建立一个类似于“序列”的架构,其中所有子元素都是可选的,但是至少必须存在一个元素,并且可能存在多个元素。

我尝试执行以下操作,但是XMLSpy抱怨“内容模型包含元素和不能唯一确定的元素。”:

    <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>

这样做,您可以强制选择第一个元素,然后其余部分是可选的,第二个元素是可选的,其余部分是可选的,第三个元素。

我希望这应该做您想要的。

当然,您可以将子序列分成几组,以避免在错过每个序列时重复每个元素。

关于xml - “any one or more of these elements but must be at least one”的XML模式构造,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/100228/

10-12 02:10