构建XSD验证<r>元素必须仅包含itm或fct其中一个
问题:验证
<r>元素必须恰好包含itm或fct子元素中的一个 我正在构建一份XSD,需要验证<trs>下的<r>元素必须恰好包含itm或fct这两个子元素中的一个,目前尚未找到正确的实现方法。
XML示例
<trs> <r NUM="1"> <itm F01="123"/> <F65>1.00</F65> </r> <r NUM="2"> <fct F02="345"/> <F65>2.00</F65> </r> </trs>
我尝试编写的XSD
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="trs"> <xs:complexType> <xs:sequence> <xs:element name="r" maxOccurs="unbounded" minOccurs="1"> <xs:complexType> <xs:sequence> <xs:element name="itm" minOccurs="0"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:short" name="F01"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="fct" minOccurs="0"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:short" name="F02"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element type="xs:float" name="F65"/> </xs:sequence> <xs:attribute type="xs:byte" name="NUM"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
解决方案
要实现“必须恰好包含itm或fct中的一个”的验证,需要使用xs:choice元素替代原来的xs:sequence中直接并列的itm和fct,同时设置xs:choice的minOccurs="1"和maxOccurs="1",确保每个<r>元素必须且只能选择其中一个子元素。
修改后的XSD如下:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="trs"> <xs:complexType> <xs:sequence> <xs:element name="r" maxOccurs="unbounded" minOccurs="1"> <xs:complexType> <xs:sequence> <!-- 使用choice确保二选一 --> <xs:choice minOccurs="1" maxOccurs="1"> <xs:element name="itm"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:short" name="F01"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="fct"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:short" name="F02"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:choice> <xs:element type="xs:float" name="F65"/> </xs:sequence> <xs:attribute type="xs:byte" name="NUM"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
修改说明
- 将原来的
itm和fct元素包裹在xs:choice中,并设置minOccurs="1"和maxOccurs="1",强制要求必须选择且只能选择其中一个。 - 移除了
itm和fct自身的minOccurs="0",因为choice已经控制了出现次数。
内容的提问来源于stack exchange,提问作者eboth225
相关产品推荐
相关产品推荐

