我想做这样的验证:
<A>
<B> or <C>
<D>
</A>
中,第一个元素应该是B和C中的一个,第二个元素是D。同时,第一个元素B或C与第二个元素不按顺序排列。它可能会变成 和 。有人知道怎么做吗
我得到了最佳实践。应该如下:
<xs:element name="A">
<xs:complexType>
<xs:all>
<xs:element ref="Choice" minOccurs="1" maxOccurs="1"/>
<xs:element ref="D" minOccurs="0" maxOccurs="1"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="D" type="xs:string"/>
<xs:element name="Choice" abstract="true"/>
<xs:element name="B" substitutionGroup="Choice">
</xs:element>
<xs:element name="C" substitutionGroup="Choice">
</xs:element>
要匹配您的示例,请尝试:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:element name="B" type="xs:string"/>
<xs:element name="C" type="xs:string"/>
</xs:choice>
<xs:element name="D" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这里必须使用两个东西,第一个是
<xs:choice>
,它只允许 xml 中存在一个元素。
为了使元素可选 (D),您必须指定
minOccurs="0"
。
编辑(反馈后):此 XSD 涵盖所有有效案例。
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="B" type="xs:string"/>
<xs:element name="C" type="xs:string"/>
<xs:element name="D" type="xs:string"/>
<xs:complexType name="OurType">
<xs:choice>
<xs:sequence>
<xs:element ref="D"/>
<xs:choice>
<xs:element ref="B"/>
<xs:element ref="C"/>
</xs:choice>
</xs:sequence>
<xs:sequence>
<xs:choice>
<xs:element ref="B"/>
<xs:element ref="C"/>
</xs:choice>
<xs:element ref="D"/>
</xs:sequence>
</xs:choice>
</xs:complexType>
<xs:element name="A" type="OurType"/>
</xs:schema>
使用
extension
:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:complexType name="MUSTHAVEB">
<xs:sequence>
<xs:element name="B"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ATYPE">
<xs:complexContent>
<xs:extension base="MUSTHAVEB">
<xs:choice>
<xs:element name="C"/>
<xs:element name="D"/>
</xs:choice>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="A" type="ATYPE"/>
</xs:schema>