XSD选择里面全部带多项选择



对于相同的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)是必需条件

这表明您希望在elementsequence之间有一个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

最新更新