2011-04-28 14 views
7

Tengo algunos documentos XML sobre los cuales no tengo control alguno. Su estructura está bien definida, pero se describe en un grupo de archivos PDF que, a pesar de ser muy exactos, no hacen que la validación automatizada sea muy manejable. Intento escribir un esquema XML para hacer (la mayoría de) las reglas en esos archivos PDF ejecutables.¿Cómo permitir que los valores tipeados estén vacíos con un esquema XML?

Todos los elementos son obligatorios. Pero aproximadamente la mitad de ellos puede estar vacía o tener un contenido mecanografiado simple.

Al definir los tipos de datos para estos elementos, definí dos versiones de cada uno: uno "normal" y otro que puede estar vacío. Hice esto mediante la definición de los sindicatos con un tipo de datos empty:

<xs:simpleType name="empty"> 
    <xs:restriction base="xs:string"> 
    <xs:length value="0"/> 
    </xs:restriction> 
</xs:simpleType> 

<xs:simpleType name="codPostal"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="^[0-9]{4}-[0-9]{3}$"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="opt_codPostal"> 
    <xs:union memberTypes="empty codPostal"/> 
</xs:simpleType> 

¿Existe una manera menos repetitivo de hacer esto?

Respuesta

6

Puede usar xs: nillable.

En XSD

<xs:simpleType name="codPostal"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="^[0-9]{4}-[0-9]{3}$"/> 
    </xs:restriction> 
</xs:simpleType> 

<xs:element name="OptionalString" type="codPostal" nillable="true" /> 

En el Documento

<OptionalString xsi:nil="true" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 

Esto es muy útil para los tipos que no son cadenas (por ejemplo, fecha y hora, etc.) como para las cadenas es posible que utilices longitud cero.

<OptionalString /> 

Desafortunadamente debe especificar el atributo "nil" en el documento. Por lo que yo sé, la única forma no intrusiva de hacer lo que desea es el enfoque de tipo de unión que ya ha elegido.

+0

Sí, el ejemplo de la cadena fue estúpido ... Lo cambié por uno más significativo (lo que realmente no invalida la respuesta). –

+0

I * debo * usar 'xsi: nil' en el documento? No puedo cambiar el documento :( –

+0

@Martinho: Desafortunadamente sí, también debe especificar "nil" en el documento. AFAIK la única forma no intrusiva de hacer lo que desea es el enfoque de tipo de unión que ya ha elegido –

Cuestiones relacionadas