我有两种可能的 XML 变体:
<ElementA>
<ElementB />
<ElementC />
</ElementA>
<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(或其替换组中的元素) 违反“唯一粒子归属”。在对此进行验证期间 模式,这两个粒子将会产生歧义。
有什么好的解决办法吗?
您可以在
<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>