【问题标题】:minOccurs and maxOccurs on elements inside xsd:choicexsd:choice 中元素的 minOccurs 和 maxOccurs
【发布时间】:2015-01-23 14:40:21
【问题描述】:

我有一个根元素 <a> 及其子元素 <b>, <c>, <d>

这是我需要的:

  • 子元素可以按任意顺序出现
  • 只需 1 个<b>
  • 超过1个<c>
  • 0 或 1 <d>

例如:

<a>
    <c />
    <b />
    <c />
    <d /> 
</a>

这是我的 XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
  <xs:element name="a">
    <xs:complexType>
      <xs:choice>
        <xs:element name="b" />
        <xs:element name="c" minOccurs="1" maxOccurs="unbounded"/>
        <xs:element name="d" minOccurs="0" maxOccurs="1"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

但是xs:element 中的minOccursmaxOccurs 可能不起作用。运行示例时,出现错误:

元素&lt;b&gt; 不允许在元素&lt;a&gt; 下的此位置。

我该如何解决这个问题?

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    您的 XSD 如下所示:a 中,您可以选择以下选项之一:

    1. 单个 b 元素。
    2. 一个或多个c 元素。
    3. 零个或一个d 元素。

    您的 XML 选择选项 #2。它没有第二选择,当解析器遇到b元素时,它会正确报告违规。

    您可能认为可以通过授予多项选择来解决此问题:

      <xs:choice maxOccurs="unbounded">
    

    现在的意思是:a 内,您可以重复选择以下选项之一:

    1. 单个 b 元素。
    2. 一个或多个c 元素。
    3. 零个或一个d 元素。

    您的 XML 现在将选择选项 #2,然后是选项 #1,然后是选项 #2,然后是选项 #3,然后声明您的 XML 是有效的。成功了吗?

    不,如果您希望确保只有一个 b 元素子元素,则不会,因为选择本身是重复的,并且选项#1 可以重复选择,每次允许单个b 元素,但总的来说,有效地允许多个 b 元素。

    因此,xsd:choice 以及事实上 XSD 1.0 通常不能用于表示您的约束。

    您的选择?在 XSD 之外的代码中检查此约束,或使用 XSD 1.1 的 xsd:assert

    XSD 1.1 解决方案

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
               vc:minVersion="1.1">
      <xs:element name="a">
        <xs:complexType>
          <xs:choice maxOccurs="unbounded">
            <xs:element name="b" />
            <xs:element name="c"/>
            <xs:element name="d"/>
          </xs:choice>
          <xs:assert test="count(b) = 1 and count(c) > 1 and count(d) >= 0"/>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    【讨论】:

    • 不幸的是,我必须使用 XSD 1.0,但您的回答对我有帮助。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2011-11-04
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多