“任何一个或多个这些元素但必须至少有一个”的 XML 模式构造

StackOverflow https://stackoverflow.com/questions/100228

  •  01-07-2019
  •  | 
  •  

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

我尝试执行以下操作,但 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/en-us/library/aa468557.aspx#understandxsd_topic5您可以利用诸如 分钟出现次数 关于选择定义(合成器)本身:

“在合成器上使用出现约束适用于整个组”

(请参阅使用嵌套复杂类型的更复杂的示例和 AuthorType 示例)

您将您的要求表述为“必须至少存在一个元素,并且可以有多个元素”。因此,我建议您尝试以下操作:

<xs:choice minOccurs="1" maxOccurs="unbounded">
    <xs:element name="DateConstant" type="..."/>
    <xs:element name="TimeConstant" type="..."/>
</xs:choice>

@赫斯特,

不幸的是,您未能理解原来的问题。当包含 minOccurs="0" 的所有元素作为选项时,将自动满足将 minOccurs="1" 放置在选项上。

因此,您未能考虑原始海报所要求的“至少一个”,因为没有元素正确满足两个完全可选元素的出现 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)。

因此,您现在拥有这两个元素中的“任何一个或多个”。当然,您拥有的选项越多,情况就会变得更加复杂,因为您需要为所有可能的组合提供额外的选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top