【问题标题】:XSD: specify a choice must have at least one from a list but no more than one of eachXSD:指定一个选项必须至少有一个列表,但每个选项不能超过一个
【发布时间】:2012-01-03 17:09:57
【问题描述】:

这让我发疯了好几个小时。我已经阅读了关于 SO 和 Internet 其他部分的所有相关 XSD 问题,但似乎仍然没有答案。

我需要一个 XML 模式,它要求至少存在一个元素列表,但每个元素可能只出现 0 或 1 次。

这类似于这个问题: XML schema construct for "any one or more of these elements but must be at least one"

但我无法限制上限:我显然错误地使用了maxOccurs

这里是我的架构中断的地方:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:complexType name="Selects">
        <xs:sequence minOccurs="2" maxOccurs="4">
        <xs:choice>
        <xs:element name="aaa" minOccurs="1" maxOccurs="1"/>
        <xs:element name="bbb" minOccurs="1" maxOccurs="1"/>
        <xs:element name="ccc" minOccurs="1" maxOccurs="1"/>
        <xs:element name="ddd" minOccurs="1" maxOccurs="1"/>
        </xs:choice>
    </xs:sequence>
    </xs:complexType>
    <xs:element name="baseElement">
        <xs:complexType>
        <xs:sequence>
        <xs:element name="MyChoice" type="Selects"/>
            </xs:sequence>
    </xs:complexType>
    </xs:element>
</xs:schema>

我在选择和元素上尝试了minOccursmaxOccurs,但没有成功。这是验证的 XML,但我不希望它:

<?xml version="1.0" encoding="UTF-8"?>
<baseElement xsi:noNamespaceSchemaLocation="myTest.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <MyChoice>
        <ddd/>
        <ddd/>
    </MyChoice>
</baseElement>

如果可能的话,这是我想要的示例:

<?xml version="1.0" encoding="UTF-8"?>
<baseElement xsi:noNamespaceSchemaLocation="myTest.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <MyChoice>
        <ddd/>
        <aaa/>
        <ccc/>
    </MyChoice>
</baseElement>

我希望它抱怨多个 ddd 元素,但允许任何或所有其他元素以任何顺序排列。如果我在 MyChoice 下只有一个元素,我会收到一个错误,所以至少有些东西可以工作。

我做错了什么?如何防止多个相同元素验证?

更新

这是我的解决方案(来自 cmets 的回答如下):

实际上,xs:all 成功了。我交换了所有的选择并将 minOccurs="0" maxOccurs="1" 添加到每个元素。对于 xs:all,minOccurs 必须为 0 或 1,maxOccurs 必须为 1。感谢您的帮助 - 我现在可以开始了!

【问题讨论】:

    标签: xsd xml-validation


    【解决方案1】:

    只需将&lt;xs:sequence minOccurs="2" maxOccurs="4"&gt; 从选项周围移动到您想进一步使用它的位置。 (您也可以删除 min/max 发生 = 1,因为这是 xs:choice 所做的)

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
      <xs:complexType name="Selects">
        <xs:choice>
          <xs:element name="aaa" />
          <xs:element name="bbb" />
          <xs:element name="ccc" />
          <xs:element name="ddd" />
        </xs:choice>
      </xs:complexType>
      <xs:element name="baseElement">
        <xs:complexType>
          <xs:sequence minOccurs="2" maxOccurs="4">
            <xs:element name="MyChoice" type="Selects" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    这验证了以下内容:

    <baseElement xsi:noNamespaceSchemaLocation="myTest.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <MyChoice>
        <bbb></bbb>
      </MyChoice>
      <MyChoice>
        <ccc></ccc>
      </MyChoice>
    </baseElement>
    

    更新

    我认为您已经达到了使用 XSD 所能达到的极限。除了为每个可能的组合定义 MyChoice 类型的“版本”(然后需要不同的名称 MyChoice1、MyChoice2 等)之外,我看不出有任何其他方法可以做到这一点

    你也可以使用 xs:all

      <xs:complexType name="Selects">
        <xs:all minOccurs=2 maxOccurs=4>
          <xs:element name="aaa" />
          <xs:element name="bbb" />
          <xs:element name="ccc" />
          <xs:element name="ddd" />
        </xs:all>
      </xs:complexType>
    

    但这不会阻止您拥有四个&lt;ddd/&gt;

    【讨论】:

    • 感谢您的回复......这让我更接近了。我澄清了我的问题 - 我想要一个下面有多个元素的 MyChoice
    • 谢谢。如果我愿意接受多个相同的选择,那么在那里会有选择吗?也就是说,在MyChoice 下,我可以有 2 到 4 个元素的任意组合选项?
    • 对不起,保罗,我不明白。您可以使用&lt;xs:all minOccurs="" maxOccurs="" &gt;,但这不会限制您重复相同的子元素。查看进一步更新
    • 谢谢休 - 我已经放弃了防止重复子元素。这并不重要。
    • 实际上,xs:all 成功了。我将choice 换成了all 并将minOccurs="0" maxOccurs="1" 添加到每个元素中。对于xs:allminOccurs 必须为 0 或 1,maxOccurs 必须为 1。感谢您的帮助 - 我现在可以开始了!
    猜你喜欢
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多