Neue Antwort auf alte Frage
Keine der vorhandenen Antworten auf diese alte Frage befasst sich mit dem eigentlichen Problem.
Das eigentliche Problem war, dassxs:complexTypemanxs:extensionals Kind in XSDnicht direkt einen haben kann. Das Update ist zuerst zu verwendenxs:simpleContent. Details folgen ...
Ihr XML,
<price currency="euros">20000.00</price>
wird gegen gültig entweder den folgenden korrigiert XSDs:
Lokal definierter Attributtyp
<?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>
Global definierter Attributtyp
<?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>
Anmerkungen
- Wie von @Paul kommentiert, ändern diese zwar den Inhaltstyp von
pricevon xs:stringnach xs:decimal, dies ist jedoch nicht unbedingt erforderlich und war nicht das eigentliche Problem.
- Wie von @ user998692 beantwortet , können Sie die Definition der Währung trennen und zu ändern
xs:decimal, aber auch dies war nicht das eigentliche Problem.
Das eigentliche Problem war, dass xs:complexTypeman xs:extensionals Kind nicht direkt eine XSD haben kann; xs:simpleContentwird zuerst benötigt.
Eine verwandte Angelegenheit (die nicht gefragt wurde, aber möglicherweise andere Antworten verwirrt hat):
Wie könnte priceeingeschränkt werden, wenn es ein Attribut hat?
In diesem Fall wäre eine separate globale Definition von priceTypeerforderlich. Dies ist nicht nur mit lokalen Typdefinitionen möglich.
So beschränken Sie den Elementinhalt, wenn das Element ein Attribut hat
<?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>