2010-11-19 15 views
6

estoy tratando de definir una regla de esquema en el XSD, para los que una cadena es de 8 caracteres de longitud:XSD patrón de expresión regular: esto o nada

<PostedDate>42183296</PostedDate> 

y también se permite el espacio de llenado:

<PostedDate>  </PostedDate> 

que me llevó a la XSD:

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:length value="8" />   //exactly 8 characters long 
</xs:simpleType> 

pero el valor puede ser también correo mpty (es decir cero caracteres de longitud):

<PostedDate></PostedDate> 
<PostedDate /> 

lo que me llevó a probar ingenuamente:

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:length value="8" />   //exactly 8 characters long 
     <xs:length value="0" />   //exactly 0 characters long 
</xs:simpleType> 

Lo que por supuesto no está permitido.

Como suele ser el caso en el XSD, la mayoría de los formatos no se puede representar fácilmente con XSD, así que decidimos probar una regla de expresión regular:

.{8} | "" 

el que tratar de convertir a XSD I Tipo:

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value=".{8}|''" /> 
    </xs:restriction> 
</xs:simpleType> 

Pero no funcionó:

''20101111' is not facet-valid with respect to pattern '.{8}|''' for type 'DateFormat' 

también intenté

  • <xs:pattern value="[0-9]{8}|''" />
  • <xs:pattern value="([0-9]{8})|('')" />
  • <xs:pattern value="(\d{8})|('')" />

Puede cualquier otra cosa de un patrón que resuelve el problema de que concuerde con cualquiera - algún patrón específico - vacío

Bono: puede cualquier persona apunta al lugar en the XSD documentation que dice que \d coincide con los dígitos? ¿O cuáles son los otros códigos de patrón especiales?

+0

Creo que '\ d {8}?' Debería funcionar. '?' significa que lo que sea antes es opcional. –

Respuesta

11

Supongo que los patrones deberían verse como \d{8}| que significan "ocho dígitos o nada", pero no ocho dígitos o dos comillas. Sin embargo, esto no explica por qué 20101111 no coincide. ¿Estás seguro de que no hay espacios en blanco u otros símbolos adicionales en el valor del elemento?
\d se dice que coincida con dígitos en la sección "carácter de clase F.1.1 Escapes"

+0

Ese es el truco que nunca hubiera imaginado '\ d {8} |' significa * "ocho dígitos | nada" *. Furtivo. Y tienes razón; No sé por qué mi patrón '. {8} | ''' no coincidía con '20101111' antes, ahora sí.Aunque antes estaba usando un sitio web para validar xml + xsd. Desde la hora del almuerzo, escribí un programa xml-studio para dar más comentarios interactivos. –

+2

También es importante tener en cuenta que una restricción 'xs: totalDigits' debe venir ** después de ** una restricción' xs: pattern'. De lo contrario, el analizador convierte internamente el texto '000001' en el dígito simple' 1', que luego no valida con el patrón '(\ d) {6}', ¡ya que no tiene 6 caracteres de largo! –

3

También en la misma situación como la cadena vacía se encuentra habilitado el caso contrario debe 6 números de longitud. Por fin usé como el siguiente. Esto funciona para mí

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="|[0-9]{8}" /> 
    </xs:restriction> 
</xs:simpleType> 
Cuestiones relacionadas