元素的 XSD,当元素既可以是强制元素也可以是可选元素时

问题描述 投票:0回答:1

我有两种可能的 XML 变体:

  1. “ElementB”和“ElementC”都是必填项。
    <ElementA>
        <ElementB /> 
        <ElementC />
    </ElementA>
  1. “ElementB”和“ElementD”都是必填项,但“ElementC”是可选的。
    <ElementA>
        <ElementB /> 
        <ElementC />
        <ElementD />
    </ElementA>

我需要类似的东西


<xs:group name="ElementsD">
   <xs:sequence>
      <xs:element name="ElementC " type="ElementCType" minOccurs="0" maxOccurs="1" />
      <xs:element name="ElementD " type="ElementDType" minOccurs="1" maxOccurs="1" />
   </xs:sequence>
</xs:group>

<xs:element name="ElementA">
   <xs:complexType>
        <xs:sequence>
            <xs:element name="ElementB " type="ElementBType" minOccurs="1" maxOccurs="1" />
            <xs:choice>
                <xs:element name="ElementC" type="ElementCType" minOccurs="1" maxOccurs="1" />
                <xs:group ref="ElementsD" />
            </xs:choice>
        </xs:sequence>
   </xs:complexType>
</xs:element>

此模式不起作用,因为

ElementC 和 ElementC(或其替换组中的元素) 违反“唯一粒子归属”。在对此进行验证期间 模式,这两个粒子将会产生歧义。

有什么好的解决办法吗?

xsd xsd-validation
1个回答
0
投票

您可以在

<xs:sequence>
内使用
<xs:choice>
。这允许您定义一个元素中可能出现的多个序列(但在所述元素的任何出现中一次只允许其中一个)。

<xs:element name="ElementA">
   <xs:complexType>
        <xs:choice>
            <xs:sequence>
                 <xs:element name="ElementB" type="ElementBType" minOccurs="1" maxOccurs="1" />
                 <xs:element name="ElementC" type="ElementCType" minOccurs="1" maxOccurs="1" />
            </xs:sequence>
            <xs:sequence>
                 <xs:element name="ElementB" type="ElementBType" minOccurs="1" maxOccurs="1" />
                 <xs:element name="ElementC" type="ElementCType" minOccurs="0" maxOccurs="1" />
                 <xs:element name="ElementD" type="ElementDType" minOccurs="1" maxOccurs="1" />
            </xs:sequence>
        </xs:choice>
   </xs:complexType>
</xs:element>
© www.soinside.com 2019 - 2024. All rights reserved.