2012-01-16 8 views
8

Estoy creando un esquema XML que almacena información sobre casas.Esquema XML Cómo declarar el precio y la moneda

Quiero almacenar el price y el currency.

Tengo sentido en mi mente declarar esto teniendo la moneda como un atributo del elemento de precio.

Además, quiero restringir los valores que se pueden ingresar como currency a libras, euros o dólares.

Ejem:

<price currency="euros">10000.00</price> 

Así que en este momento estoy declarando esto en mi esquema XML como:

<!-- House Price, and the currency as an attribute --> 
<xs:element name="price"> 
    <xs:complexType> 
     <xs:attribute name="currency"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:enumeration value="pounds" /> 
        <xs:enumeration value="euros" /> 
        <xs:enumeration value="dollars" /> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 
</xs:element> 

El problema que tengo con esto:

  • I No estoy exactamente seguro de si esto restringirá el elemento de atributo a pounds, euros or dollars
  • Me parece que no puede especificar un type sobre el precio de una habitación doble, ya que me gustaría debido al error:

    Element 'price' has both a 'type' attribute and a 'anonymous type' child. Only one of these is allowed for an element.

¿Debo mantenerlo simple y declararlos como elementos separados:

<price>10000.00</price> 
<currency>euros</currency> 

... ¿o estoy en el camino correcto?

Respuesta

2

A continuación se define el elemento price tener un valor xs:double con un atributo que es currency valores están restringidos a un valor de: libras, euros o dólares.

<xs:element name="price"> 
     <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:double"> 
        <xs:attribute name="currency"> 
         <xs:simpleType> 
          <xs:restriction base="xs:string"> 
           <xs:enumeration value="pounds" /> 
           <xs:enumeration value="euros" /> 
           <xs:enumeration value="dollars" /> 
          </xs:restriction> 
         </xs:simpleType> 
        </xs:attribute> 
       </xs:extension> 
      </xs:simpleContent> 
     </xs:complexType> 
    </xs:element> 
4

Desea un "tipo complejo con contenido simple". Se puede encontrar un ejemplo aquí:

http://www.w3schools.com/schema/el_simpleContent.asp

+0

Hola Michael, agradezco la respuesta, pero todavía estoy un poco confundido. ¿Es el "tipo complejo con contenido simple" para el atributo, o para el elemento 'precio' en general? Supongo que no podrías darme un ejemplo. Gracias de nuevo :) – Luke

13

Tomado del enlace publicado por Michael Kay y aplicado a su problema. (Nota: El uso 'decimal' escriba en lugar de 'doble' para evitar errores de precisión.)

<xs:element name="price"> 
    <xs:complexType> 
    <xs:simpleContent> 
     <xs:extension base="xs:decimal"> 
     <xs:attribute name="currency" type="currencyType"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

<xs:simpleType name="currencyType"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value="pounds"/> 
    <xs:enumeration value="euros"/> 
    <xs:enumeration value="dollars"/> 
    </xs:restriction> 
</xs:simpleType> 

---- Example ---- 

<price currency="euros">10000.00</price> 
0

Como práctica en uso, echar un vistazo a la implementación de PayPal's SOAP API.

El servicio define un conjunto de códigos para monedas (CurrencyCodeType definido dentro de eBLBaseComponents.xsd) después del ISO-4217 standard.

AmountType (definido por CoreComponentTypes.xsd) es una composición de un doble con un atributo de currencyType.

Recomendaría utilizar un enfoque similar en su aplicación, restringiendo las monedas aceptables en su lógica comercial, en lugar de hacerlo en el esquema.

¡Salud!

3

o como una extensión de la respuesta Michaels:

<xs:element name="price"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:decimal"> 
       <xs:attribute name="currency"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:enumeration value="pounds" /> 
          <xs:enumeration value="euros" /> 
          <xs:enumeration value="dollars" /> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

si lo quieres en una etiqueta. eso simplemente agrega el atributo con enumeración a un tipo decimal, por lo que se logrará el resultado deseado.

Cuestiones relacionadas