2010-11-30 38 views
6

Mi problema (o pregunta) se centra en elementos vacíos que se escriben como xs: entero. Necesito permitir elementos vacíos, así que utilicé una unión para permitir que un elemento vacío o un número entero válido sea el valor que se muestra en el esquema a continuación. Sin embargo, mi esquema cumple una doble función y también debe importarse en un software de terceros que espera tipos de datos de cadena, flotante, entero o fecha. Si codigo el esquema utilizando el método union para todos los enteros, no se escribirán como enteros en el software. ¿Hay alguna otra manera que no sea el método de unión de permitir un elemento vacío para tipos de datos enteros? Me gustaría simplemente tener un XSD, pero puedo tener dos si eso es lo que debe suceder.XSD: opciones para permitir valores nulos al declarar xs: tipos de datos enteros

Dada XML de ejemplo de:

<?xml version="1.0" encoding="UTF-8"?> 
<company> 
    <division> 
     <department> 
      <roles/> 
      <employees>7</employees> 
     </department> 
    </division> 
</company> 

y el esquema de:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:simpleType name="nullval"> 
     <xs:union memberTypes="IntegerType empty"/> 
    </xs:simpleType> 
    <xs:simpleType name="IntegerType"> 
     <xs:restriction base="xs:integer"/> 
    </xs:simpleType> 
    <xs:simpleType name="empty"> 
     <xs:restriction base="xs:string"> 
      <xs:maxLength value="0"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:element name="company"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="division"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="department" minOccurs="0" maxOccurs="unbounded"> 
           <xs:complexType> 
            <!-- elements may appear in any order --> 
            <xs:all minOccurs="0" maxOccurs="1"> 
             <xs:element name="roles" type="nullval"/> 
             <xs:element name="employees" type="xs:integer"/> 
            </xs:all> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Respuesta

9

Ha intentado

<xs:element name="roles" type="xs:integer" nillable="true"/> 
+0

Sí, probé tanto nillable = "true" como minOccurs = "0" y no funcionó (utilizando XMLSpy con Saxon). – johkar

+0

¿Tiene algún control sobre el XML que se envía? ¿Puedes establecer xsi: nil = "true" en el elemento roles? (ref. http://www.w3.org/TR/xmlschema11-1/#xsi_nil) – sho222

+0

Eso es una buena idea. Sí, tengo acceso al XML. Es bastante grande XML y hay muchos elementos declarados como tipos de datos enteros, así que no estoy seguro de querer ir por ese camino. Puede ser más fácil simplemente eliminar todas las etiquetas vacías si voy a tener que hacer un pase adicional. Gracias. – johkar

5

hola la nillable = "true" y minOcurrencias = "0" funciona solo cuando no se envía la etiqueta. Sin embargo, si necesita pasar un valor vacío dentro de las etiquetas, creo que debe implementar una unión.

0

Tenía el mismo requisito hoy. Siguiendo XSD solo permite vacío, o cualquier valor entre -1 y 999

Estoy extrayendo solo las cosas requeridas de un XSD muy grande, por lo que algunas de ellas podrían parecer excesivas.

<xs:simpleType name="emptyString"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value=""/> 
    </xs:restriction> 
</xs:simpleType> 


<xs:simpleType name="int-1999"> 
<xs:restriction base="xs:int"> 
<xs:minInclusive value="-1"/> 
<xs:maxInclusive value="999"/> 
</xs:restriction> 
</xs:simpleType> 


<xs:element name="preNotificationPeriod" nillable="true"> 
    <xs:simpleType> 
    <xs:union memberTypes="int-1999 emptyString"/> 
    </xs:simpleType> 
</xs:element> 

Referencia - http://www.ilearnttoday.com/xsd-empty-values-and-range-restriction-for-numeric-types

More details on this article

+0

Parece que los dos enlaces no funcionan. Es posible que la página se haya movido con mayor probabilidad. –

5

Lo que tiene que hacer es asignar dos restricciones en el mismo elemento, además de hacer una unión de ellos, como en el siguiente ejemplo:

<xs:element name='job_code'> 
    <xs:simpleType> 
    <xs:union> 
     <xs:simpleType> 
     <xs:restriction base='xs:string'> 
      <xs:length value='0'/> 
     </xs:restriction> 
     </xs:simpleType> 
     <xs:simpleType> 
     <xs:restriction base='xs:integer'> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:union> 
    </xs:simpleType> 
</xs:element> 

Al usar esta restricción, le dice a la validación XML que permita cualquier valor entero y que permita que el elemento esté vacío.

Cuestiones relacionadas