XML 元素选择,但当 maxOccurs 不受限制时,元素类型相同

XML Choice of elements, but of same type when maxOccurs is unbounded

我正在尝试使用带有选择的 XSD 模式在 XML 文件中定义一个元素,这并不难:

    <xs:complexType abstract="true"
                    name="ESAPIObject">
        <xs:sequence>
            <xs:element name="PropertyName"
                        type="xs:string"/>
            <xs:element name="Condition"
                        minOccurs="1"
                        maxOccurs="unbounded">
...
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="BeamObject">
        <xs:complexContent>
            <xs:extension base="ESAPIObject">
                <xs:sequence/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="DoseObject">
        <xs:complexContent>
            <xs:extension base="ESAPIObject">
                <xs:sequence/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="StructureObject">
        <xs:complexContent>
            <xs:extension base="ESAPIObject">
                <xs:sequence/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:element name="Beam"
                type="BeamObject"/>
    <xs:element name="Dose"
                type="DoseObject"/>
    <xs:element name="Structure"
                type="StructureObject"/>

    <xs:group name="actualValueType">
        <xs:choice>
            <xs:element ref="Beam"/>
            <xs:element ref="Dose"/>
            <xs:element ref="Structure"/>
        </xs:choice>
    </xs:group>

    <xs:complexType name="SimpleConditionType">
        <xs:sequence>
            <xs:element name="ActualValue">
                <xs:complexType>
                    <xs:choice>
                        <xs:group ref="actualValueType" minOccurs="1" maxOccurs="unbounded"/>
                    </xs:choice>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

然而,令人恼火的是 ActualValue 中的 choice 元素可能会重复,但前提是它与之前的元素来自同一类型? 因此只有结构元素或光束元素或剂量元素而不是它们的混合,例如:

  <ActualValue>
   <Structure />
   <Structure />
  </ActualValue>

  <ActualValue>
   <Beam />
   <Beam />
  </ActualValue>

  <ActualValue>
   <Dose />
   <Dose />
  </ActualValue>

但不是:

  <ActualValue>
   <Structure />
   <Dose />
  </ActualValue>

我在 XSD 中找不到实现此功能的方法。有什么建议吗?

我在你的文章中发现了一些错误 XSD:

  • 您定义了一个重复选择而不是具有重复成员的选择
  • 您的组引用周围有多余的
  • 您的全局组 'ActualValueType' 应该是 'ActualValueGroup'(组不是类型,因此区分很重要)

为了更容易地测试你的xsd,我做了ActualValue一个全局元素声明。

进行这些更改后,我得到了这个:

    <xs:group name="actualValueGroup">
        <xs:choice>
            <xs:element ref="Beam" maxOccurs="unbounded"/>
            <xs:element ref="Dose" maxOccurs="unbounded"/>
            <xs:element ref="Structure" maxOccurs="unbounded"/>
        </xs:choice>
    </xs:group>

    <xs:element name="ActualValue">
        <xs:complexType>
          <xs:group ref="actualValueGroup" minOccurs="1" maxOccurs="1"/>
        </xs:complexType>
    </xs:element>

...正确接受或拒绝您的每个示例。