我正在尝试编写一个 XSD 来验证 XML,其中以下内容必须为真:
一个元素(父元素)包括:
因此,例如,有效的 XML 为:
<Parent>
<Choice1>xxx</Choice1>
<Field1>yyy</Field1>
<Field2>yyy</Field2>
</Parent>
就像这样:
<Parent>
<Field3>yyy</Field3>
<Choice2>xxx</Choice2>
<Field2>yyy</Field2>
</Parent>
无效的是:
<Parent>
<Field3>yyy</Field3>
<Field2>yyy</Field2>
</Parent>
我似乎无法按照我的意愿嵌套 xs:choice 和 xs:all 。
是的,
<xs:choice>
不能直接插入到<xs:all>
中。
但是你可以使用替换组达到相同的效果:
<xs:element name="Parent">
<xs:complexType>
<xs:all>
<xs:element ref="Choice" minOccurs="1"/>
<xs:element name="Field1" type="xs:string"/>
<xs:element name="Field2" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="Choice" abstract="true"/>
<xs:element name="Choice1" substitutionGroup="Choice"> ... </xs:element>
<xs:element name="Choice2" substitutionGroup="Choice"> ... </xs:element>
使用
extension
:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:complexType name="MUSTHAVEFIELD">
<xs:sequence>
<xs:element name="Field1"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="PARENTTYPE">
<xs:complexContent>
<xs:extension base="MUSTHAVEFIELD">
<xs:choice>
<xs:element name="Choice1"/>
<xs:element name="Choice2"/>
</xs:choice>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="Parent" type="PARENTTYPE"/>
</xs:schema>