Nueva respuesta a la pregunta anterior
Ninguna de las respuestas existentes a esta vieja pregunta aborda el problema real.
El verdadero problema era quexs:complexType
no se puede tener directamentexs:extension
un hijo en XSD. La solución es usarxs:simpleContent
primero. Los detalles siguen ...
Tu XML,
<price currency="euros">20000.00</price>
será válido contra cualquiera de los siguientes XSD corregidos:
Tipo de atributo definido localmente
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<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>
</xs:schema>
Tipo de atributo definido globalmente
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<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>
<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:schema>
Notas
- Como se ha comentado por @ Pablo , éstos hacen cambiar el tipo de contenido
price
a partir xs:string
de xs:decimal
, pero esto no es estrictamente necesario y no era el verdadero problema.
- Como respondió @ user998692 , podría separar la definición de moneda y cambiar a
xs:decimal
, pero este tampoco era el problema real.
El problema real era que xs:complexType
no se puede tener directamente xs:extension
un hijo en XSD; xs:simpleContent
se necesita primero.
Un asunto relacionado (que no se preguntó pero puede haber confundido otras respuestas):
¿Cómo se podría price
restringir dado que tiene un atributo?
En este caso, priceType
sería necesaria una definición global separada de ; no es posible hacer esto solo con definiciones de tipos locales.
Cómo restringir el contenido del elemento cuando el elemento tiene un atributo
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="priceType">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0.00"/>
<xs:maxInclusive value="99999.99"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="price">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="priceType">
<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>
</xs:schema>