【问题标题】:xsd choice inside all with multiple choicexsd 里面的选择都带有多项选择
【发布时间】:2015-08-10 01:49:24
【问题描述】:

我对同一个 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
  • 蒙托

以下标签是有条件的:

  • DATOS
  • 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)是必需的条件。
  • 如果 中元素的顺序是固定的,你可以吗?您使用的是 XSD 1.0 还是 XSD 1.1?
  • @sergioFC 我认为版本是1.0
  • ¿你可以使用 XSD 1.1 吗?

标签: xml validation xsd sax multiple-choice


【解决方案1】:

(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>

这将验证您问题中的两个示例消息。

【讨论】:

  • OP 说“我总是必须使用 all 标签”。仅当 OP 可以取消该限制时,此答案才是正确的。
【解决方案2】:

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

【讨论】:

  • 如果我使用 assert,我无法执行应用程序,因为它显示以下异常:org.xml.sax.SAXNotSupportedException: the specified schema language is not supported
  • @DanielB。好的,所以这个答案对您无效,因为您似乎需要 XSD 1.0 解决方案
猜你喜欢
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
相关资源
最近更新 更多