XML模式构造为"这些元素中的任何一个或多个,但必须至少为一个"

Sco*_*eis 22 xml schema xsd

我正在尝试设置一个类似于"序列"的模式的一部分,其中所有子元素都是可选的,但至少有一个元素必须存在,并且可能存在多个元素.

我尝试执行以下操作,但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>
Run Code Online (Sandbox Code Playgroud)

可以这样做(如果是这样,怎么做)?

一些澄清:我只想允许同名的每个元素之一.可以有一个"DateConstant"和/或一个"TimeConstant",但不是两个.Gizmo的答案符合我的要求,但对于大量元素来说这是不切实际的.Hurst的答案允许两个或多个同名的元素,这是我不想要的.

giz*_*zmo 24

试试这个:

<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>
Run Code Online (Sandbox Code Playgroud)

这样做,你强制要么选择第一个元素,然后其余的是可选的,要么第二个元素,其余的是可选的,要么是第三个元素.

我希望,这应该做你想要的.

当然,您可以将子序列放入组中,以避免在您意识到错过一个元素时复制每个序列中的元素.

  • 考虑到一个人可以轻松拥有几十个需要数百个序列元素来表示这些*排列*的元素,这真的是一种很好的做法吗? (3认同)

小智 17

根据MSDN上的技术文章标题为理解XML Schema,请 访问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>
Run Code Online (Sandbox Code Playgroud)