Nova resposta para a velha pergunta
Nenhuma das respostas existentes para esta velha questão aborda o problema real.
O verdadeiro problema é quexs:complexType
não é possível terxs:extension
um filhodiretamenteno XSD. A solução é usarxs:simpleContent
primeiro. Detalhes a seguir ...
Seu XML,
<price currency="euros">20000.00</price>
será válido em qualquer um dos seguintes XSDs corrigidos:
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 comentado por @ Paulo , estes mudam o tipo de conteúdo
price
a partir xs:string
dexs:decimal
, mas isso não é estritamente necessário e não era o problema real.
- Conforme respondido por @ user998692 , você poderia separar a definição de moeda e alterar para
xs:decimal
, mas esse também não era o problema real.
O verdadeiro problema é que xs:complexType
não podemos ter xs:extension
um filho diretamente no XSD;xs:simpleContent
é necessário primeiro.
Um assunto relacionado (que não foi perguntado, mas pode ter confundido outras respostas):
Como poderia price
ser restringido dado que tem um atributo?
Neste caso, uma definição global separada de priceType
seria necessária; não é possível fazer isso apenas com definições de tipo local.
Como restringir o conteúdo do elemento quando o elemento tem 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>