对于相同的xsd,我有两种类型的请求:
请求1<REQUEST>
<ID_CLIENTE>123456</IDCLIENTE>
<NUMERO_TARJ>11111111111111</NUMERO_TARJ>
<MES_VENC>04</MES_VENC>
<ANO_VENC>18</ANO_VENC>
<MONTO>150.00</MONTO>
</REQUEST>
请求2 <REQUEST>
<ID_CLIENTE>123456</IDCLIENTE>
<DATOS>1112124548797987984489848468448</DATOS>
<MONTO>150.00</MONTO>
</REQUEST>
需要以下标签:
- ID_CLIENTE
- MONTO
下列标签是有条件的:
- 拿督
- NUMERO_TARJ
- MES_VENC
- ANO_VENC
如果我发送DATOS标签,我不能发送NUMERO_TARJ, MES_VENC和ANO_VENC。
如果我发送NUMERO_TARJ,我必须总是发送MES_VENC和ANO_VENC,但我不能发送DATOS标签。
我有这个XSD,但它不正确,它不验证我想(总是我必须使用all标签):
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="REQUEST">
<xs:complexType>
<xs:all>
<xs:element type="xs:long" name="ID_CLIENTE" minOccurs="1" maxOccurs="1" />
<xs:element type="xs:string" name="MONTO" minOccurs="1" maxOccurs="1"/>
<xs:element minOccurs="1" maxOccurs="1" ref="opcionales" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="opcionales" abstract="true" />
<xs:element type="xs:string" name="DATOS" substitutionGroup="opcionales"/>
<xs:element name="infotarjeta" substitutionGroup="opcionales">
<xs:complexType>
<xs:all>
<xs:element type="xs:long" name="TARJ_NUM" minOccurs="1" maxOccurs="1"/>
<xs:element type="xs:int" name="MES_VENC" minOccurs="1" maxOccurs="1"/>
<xs:element type="xs:int" name="ANO_VENC" minOccurs="1" maxOccurs="1"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
请帮我修理这个XSD。
谢谢!
(DATOS)或(TARJ_NUM and MES_VENC and ANO_VENC)是必需条件
这表明您希望在element
和sequence
之间有一个choice
:
<xs:element name="REQUEST">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:long" name="ID_CLIENTE" minOccurs="1" maxOccurs="1" />
<xs:choice>
<xs:element type="xs:string" name="DATOS"/>
<xs:sequence>
<xs:element type="xs:long" name="TARJ_NUM" minOccurs="1" maxOccurs="1"/>
<xs:element type="xs:int" name="MES_VENC" minOccurs="1" maxOccurs="1"/>
<xs:element type="xs:int" name="ANO_VENC" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:choice>
<xs:element type="xs:string" name="MONTO" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
这将验证问题中的两个示例消息
在XSD 1.1中,您可以使用断言来做您想做的事情:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:element name="REQUEST">
<xs:complexType>
<xs:all>
<xs:element type="xs:long" name="ID_CLIENTE"/>
<xs:element type="xs:string" name="MONTO"/>
<xs:element type="xs:string" name="DATOS" minOccurs="0"/>
<xs:element type="xs:long" name="TARJ_NUM" minOccurs="0"/>
<xs:element type="xs:int" name="MES_VENC" minOccurs="0"/>
<xs:element type="xs:int" name="ANO_VENC" minOccurs="0"/>
</xs:all>
<xs:assert test="(boolean(DATOS) and not(TARJ_NUM) and not(MES_VENC) and not(ANO_VENC))
or
(boolean(TARJ_NUM) and boolean(MES_VENC) and boolean(ANO_VENC) and not(DATOS))"/>
</xs:complexType>
</xs:element>
</xs:schema>
我不知道如何使用XSD 1.0。