Neue Antwort auf alte Frage
Keine der vorhandenen Antworten auf diese alte Frage befasst sich mit dem eigentlichen Problem.
Das eigentliche Problem war, dassxs:complexType
manxs:extension
als 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
price
von xs:string
nach 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:complexType
man xs:extension
als Kind nicht direkt eine XSD haben kann; xs:simpleContent
wird zuerst benötigt.
Eine verwandte Angelegenheit (die nicht gefragt wurde, aber möglicherweise andere Antworten verwirrt hat):
Wie könnte price
eingeschränkt werden, wenn es ein Attribut hat?
In diesem Fall wäre eine separate globale Definition von priceType
erforderlich. 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>