2011-07-26 14 views
8

Estoy tratando de definir un tipo de elemento en XSD, para lo cual quiero un atributo opcional, que si está presente puede contener un flotante o estar vacío (pero aún presente)XSD: restringe atributo a xs: float o ""

es decir:

<xs:element name="MyElement"> 
    <xs:complexType> 
     <xs:attribute name="optionalFloatAttribute" type="xs:float" use="optional"/> 
    </xs:complexType> 
</xs:element> 

necesidades "fijación" para permitir que todos los siguientes xml: -

<MyElement/> 
or 
<MyElement optionalFloatAttribute=""/> 
or 
<MyElement optionalFloatAttribute="3.14159"/> 

La única forma que veo de hacer esto es para cambiar el tipo de xs:string, y use xs:restriction con una expresión regular. Pero esto no me parece muy ideal. ¿Hay una mejor manera?

Y tengo a ser capaz de soportar estas variaciones del xml - el programa y XML existente es el legado, y estoy tratando de hacer una copia de crear un esquema para que coincida con la multitud de variaciones que veo en lo que tenemos que respeto como xml válido

Respuesta

1

No creo que haya una manera de manejar esto y usar xs:float. Fundamentalmente, se reduce al hecho de que la cadena vacía no es un número válido. Normalmente, esperarías un valor de 0 o que el elemento faltara por completo. Hay una buena explicación de la respuesta a la siguiente pregunta:

Empty elements for primitve datatypes forbidden in XSD

Parece que la opción de usar xs: string y una expresión regular podría ser su mejor plan.

4

Si pudieras soportar el uso de un elemento en lugar de un atributo, podrías hacer que xs: float sea nulable. De esta manera se puede utilizar el xsi: nil = "true" en el documento de instancia para indicar que el elemento tiene ningún valor:

<!-- definition --> 
<xs:element name="quantity" type="xs:float" nillable="true" /> 

<!-- instance --> 
<quantity xsi:nil="true" /> 

No hay equivalente para los atributos sin embargo.

5

puede definir el tipo de encargo para que mediante la combinación de flotador y cadena vacía:

<xs:element name="MyElement"> 
<xs:complexType> 
    <xs:attribute name="optionalFloatAttribute" type="emptyFloat" use="optional"/> 
</xs:complexType> 
</xs:element> 
<xs:simpleType name="emptyFloat"> 
    <xs:union> 
     <xs:simpleType> 
      <xs:restriction base='xs:string'> 
       <xs:length value="0"/> 
      </xs:restriction> 
     </xs:simpleType> 
     <xs:simpleType> 
      <xs:restriction base='xs:float'> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:union> 
</xs:simpleType> 

O usando regExp:

<xs:simpleType name="emptyFloat"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="-?\d*\.?\d*"/> 
    </xs:restriction> 
</xs:simpleType> 
+0

Asumo que puede hacer lo mismo con los atributos mediante el uso de 'complexType' s? Esta es una excelente respuesta y resolvió mi problema. –

Cuestiones relacionadas