XSD文件中的标签验证

时间:2019-07-16 20:25:23

标签: html xml xsd xsd-validation

有人知道如何在XSD文件中实现以下验证:

当标签TIPO的值为SER时,必须注册标签DETALLES_SERVICIOS,否则,如果值为EQU,则是可选的

我正在使用XSD 1.0版,但无法实现这种验证方式。

预先感谢您的帮助。

XML

<REQUERIMIENTO>
	<DETALLES_SOLICITUDES>
		<ID_PLAN>BP-7138</ID_PLAN>
		<ID_SUBPRODUCTO>AUT</ID_SUBPRODUCTO>
		<CANTIDAD>1</CANTIDAD>
		<TIPO>SER</TIPO>
		<DETALLES_SERVICIOS>
			<NOMBRE_USUARIO>JANIO</NOMBRE_USUARIO>
			<NUMERO_SERIE>12345</NUMERO_SERIE>
			<IN_BODEGA>130</IN_BODEGA>
		</DETALLES_SERVICIOS>
	</DETALLES_SOLICITUDES>
	<DETALLES_SOLICITUDES>
		<ID_PLAN>0</ID_PLAN>
		<ID_SUBPRODUCTO>SAMSUNG A510 G</ID_SUBPRODUCTO>
		<CANTIDAD>1</CANTIDAD>
		<TIPO>EQU</TIPO>
	</DETALLES_SOLICITUDES>
</REQUERIMIENTO>

XSD

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Technologies Online Tools 1.0 (https://www.liquid-technologies.com) -->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="REQUERIMIENTO">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="DETALLES_SOLICITUDES">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ID_PLAN" type="xs:string" />
              <xs:element name="ID_SUBPRODUCTO" type="xs:string" />
              <xs:element name="CANTIDAD" type="xs:string" />
              <xs:element name="TIPO">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="SER"/>
                    <xs:enumeration value="EQU"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element minOccurs="0" name="DETALLES_SERVICIOS">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="NOMBRE_USUARIO" type="xs:string" />
                    <xs:element name="NUMERO_SERIE" type="xs:unsignedShort" />
                    <xs:element name="IN_BODEGA" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

1 个答案:

答案 0 :(得分:0)

不可能在XSD-1.0中实现此功能,但是,如果找到使用XSD-1.1的方法,则可以在第二个xs:assert元素之后使用以下xs:sequence表达式:

<xs:assert test="((TIPO = 'SER') and DETALLES_SERVICIOS) or (TIPO='EQU')" />

编辑:@@ MichaelKay,以确保完全不可能。