首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >“这些元素中的任何一个或多个,但必须至少为一个”的XML模式构造

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

Stack Overflow用户
提问于 2008-09-19 07:24:10
回答 3查看 23.3K关注 0票数 25

我正在尝试设置一个类似于"Sequence“的模式的一部分,其中所有子元素都是可选的,但至少有一个元素必须为,并且可以有多个元素。

我尝试了以下操作,但XMLSpy抱怨说“内容模型包含元素,并且不能唯一确定。”

代码语言:javascript
复制
    <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的答案符合我的要求,但对于数量较多的元素来说是不切实际的。赫斯特的回答允许两个或更多同名的元素,这是我不想要的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-09-19 07:45:28

试试这个:

代码语言:javascript
复制
<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>

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

我希望这能做你想要的。

当然,您可以将子序列放入组中,以避免在发现缺少一个元素时在每个序列中重复一个元素。

票数 26
EN

Stack Overflow用户

发布于 2008-09-19 08:56:34

根据MSDN上题为Understanding XML Schema at http://msdn.microsoft.com/en-us/library/aa468557.aspx#understandxsd_topic5的技术文章,您可以在选择定义(合成器)本身上利用诸如minOccurs之类的约束:

“对合成器使用出现约束作为一个整体应用于整个组”

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

你说你的需求是“至少有一个元素必须存在,并且可能有不止一个”。因此,我建议您尝试以下操作:

代码语言:javascript
复制
<xs:choice minOccurs="1" maxOccurs="unbounded">
    <xs:element name="DateConstant" type="..."/>
    <xs:element name="TimeConstant" type="..."/>
</xs:choice>
票数 19
EN

Stack Overflow用户

发布于 2013-01-14 11:47:40

@hurst,

不幸的是,您没有理解原始问题。当所有具有minOccurs="0“的元素都作为选项包含时,将自动满足将minOccurs="1”放在选项上的要求。

因此,您没有考虑到原始海报所要求的“至少一个”,因为没有任何元素正确地满足两个完全可选元素的1次出现。

到目前为止,我还找不到解决方案,因为minOccur/maxOccur都与定义它们的组相关,而与节点的总数无关。您也不能使用choice元素多次定义相同的命名元素,否则它会变得“不明确”。我见过一些使用引用而不是特定类型的元素的示例,但我认为这无法通过microsoft XSD解析器。

代码语言:javascript
复制
<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 )。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/100228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档