2010-03-08 60 views
6

¿Hay alguna forma de evitar que se utilicen elementos vacíos del formulario <myElement/> en su xml? En otras palabras, ¿puede especificar en su xsd que <myElement/> no es válido?Restricción de elementos vacíos en xsd

Usando nillable="false" no funciona, ni tampoco - ambos de los permitir <myElement/>.

Respuesta

10

Si está intentando evitar que el elemento aparezca, puede marcarlo con minOccurs="0". Supongo que esto no es lo que buscas, así que si estás intentando asegurarte de que siempre hay atributos asociados al elemento complejo, entonces debes especificar usage="required" en al menos uno de los atributos o usar un atributo grupo. Si myElement es un tipo simple y desea asegurarse de que tenga un valor, entonces siempre puede restringir el tipo de este. Si quieres una cadena no es cero, entonces se podría hacer:

<xsd:element name="myElement"> 
    <xsd:simpleType> 
     <xsd:restriction base="xsd:string"> 
      <xsd:minLength value="1" /> 
     </xsd:restriction> 
    </xsd:simpleType> 
</xsd:element> 
+0

Eso parece prometedor. ¿Qué sucede si no es un tipo simple, p. "xsd: date" –

+0

'xsd: date' es un tipo simple. Pero si no es un tipo simple, puede usar ''. Aunque, con esos, normalmente utilizo el atributo 'type' de' xsd: element', es decir: '' –

+0

Así que estás diciendo 'minLength' es un propiedad válida para tipos simples sin cadena? –

4

Si el esquema de validación no es capaz de mostrar el error, cuando un elemento del tipo de datos DATE es nula, entonces se puede utilizar una patrón [si no es una carga escribir el formato requerido];

he añadido un ejemplo, la implementación de código similar funcionaría en su herramienta,

Este es el XML de ejemplo:

<root> 
    <date1>12/31/1999</date1> <!-- The Date format defined here is MM/DD/YYYY, null value or Date with any other format aren't accepted--> 
</root> 

Este es el XSD correspondiente:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="Date_Def.xsd"/> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="date1" type="DATE_TYPE" minOccurs="0" maxOccurs="1" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Observe que Estoy incluyendo un archivo de esquema más que incluye la definición de tipo DATE_TYPE,
Aquí está el archivo Date_Def.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:simpleType name="DATE_TYPE"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="([0][1-9]|[1][0-2])/([0][1-9]|[1-2][0-9]|[3][0-1])/[1-2][0-9][0-9][0-9]"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

el formato de fecha definido aquí es DD/MM/AAAA, valor nulo o fecha con cualquier otro formato no son aceptados, Si desea aceptar también una etiqueta nulo, el patrón de sustitución con este ..

<xs:pattern value="|(([0][1-9]|[1][0-2])/([0][1-9]|[1-2][0-9]|[3][0-1])/[1-2][0-9][0-9][0-9])"/> 

Validación de la cual acepta, ya sea una etiqueta nula o un valor de fecha del patrón MM/DD/YYYY.

Si necesita más ayuda sobre el diseño de patrones, siéntase libre de hacer una publicación en SO, espero que haya sido de ayuda. :-)

[nota :: El tipo de definición puede también ser definido en un mismo archivo, que necesita nombres-espacios adicionales mencionados en XML, así como archivos XSD, definiendo un archivo externo es inofensivo y reutilizable]

+0

Gracias por la respuesta detallada. Logré encontrar herramientas que validaran correctamente. Este patrón de cosas es útil, aunque. –

+0

@Chris, np [15 caracteres] –

Cuestiones relacionadas