2010-12-10 17 views
20

Este es mi código XML de ejemplo:Elemento XSD ¿Restricción no nula o vacía para Xml?

<bestContact> 
<firstName><![CDATA[12345]]></firstName> 
<lastName /> 
</bestContact> 

estoy usando:

<xs:element name="lastName" type="xs:string" minOccurs="1" nillable="false"/> 

El XSD caso de que se valide lastName que no es nulo o vacío.

Respuesta

42

Trate

<xs:element name="lastName" minOccurs="1" nillable="false"> 
    <xs:simpleType> 
    <xs:restriction base="xs:string"> 
     <xs:minLength value="1"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:element> 
+3

buena respuesta - el 'nillable' es pensamiento redundante. –

+0

@Nic - De acuerdo. Acabo de copiar y pegar la línea de la pregunta :) – Kamal

+0

Usando esto obtengo "Element 'lastName' tiene tanto un atributo 'tipo' como un tipo 'anónimo'. Solo uno de estos está permitido para un elemento." Creo que hay un problema al usar type = "xs: string" en el elemento container. –

9

@Kamal le ha dado respuesta básicamente aquí. Esta es la razón por la cual - nillable siempre parece causar problemas. Efectivamente, puede considerar nillable con el significado permitir el atributo xsi:nil en este elemento. El XML Schema spec describe nillable como una señal fuera de banda, básicamente se usa para indicar NULL en bases de datos.

Lo que queremos es un elemento que debe ser de al menos un carácter de longitud dada por @Kamal

13
<xsd:element name="lastName" type="NonEmptyString" nillable="false"/> 

<xsd:simpleType name="NonEmptyString"> 
    <xsd:restriction base="xs:string"> 
    <xsd:minLength value="1" /> 
    <xsd:pattern value=".*[^\s].*" /> 
    </xsd:restriction> 
</xsd:simpleType> 
+0

Me gusta más que las 2 que ofrece Gab, esta funciona para mí. Ya que estaba buscando una expresión que simplemente eliminara los espacios iniciales, no los espacios entre texto – ycomp

+2

Creo que puede reemplazar esta expresión regular por '\ S +' como señaló Gab. – bvdb

8

Esta es mi humilde opinión un mejor patrón:

<xs:simpleType name="NonEmptyString"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="^(?!\s*$).+" /> 
    </xs:restriction> 
</xs:simpleType> 

o

<xs:simpleType name="NonEmptyStringWithoutSpace"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="\S+"/> 
    </xs:restriction> 
</xs:simpleType> 
+0

¿hay alguna ventaja para su primera propuesta sobre la segunda? – ycomp

+0

Bueno, una cuerda blanck (no vacía) será permitida por la 1ra pero no la 2da. Solo depende de tus necesidades – Gab

0

Esta fue mi solución favorita.

<xs:simpleType name="NonEmptyString"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="[\s\S]*[^ ][\s\S]*"/> 
    </xs:restriction> 
</xs:simpleType>` 
Cuestiones relacionadas