Ich habe das folgende XML-Tag
<price currency="euros">20000.00</price>
Wie beschränke ich das Währungsattribut auf Folgendes:
UND der Preis für ein Doppel?
Ich bekomme nur eine Fehlermeldung, wenn ich auf beiden einen Tipp versuche. Folgendes habe ich bisher:
<xs:element name="price">
<xs:complexType>
<xs:attribute name="currency" type="xs:string">
<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>
Der numerische Wert scheint in Ihrer Preisdefinition zu fehlen. Versuche Folgendes:
<xs:simpleType name="curr">
<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:extension base="xs:decimal">
<xs:attribute name="currency" type="curr"/>
</xs:extension>
</xs:complexType>
</xs:element>
Keine der vorhandenen Antworten auf diese alte Frage behandelt das echte Problem.
Das eigentliche Problem war, dass xs:complexType
Nicht direkt einen xs:extension
Als haben kann Kind in XSD. Das Update besteht darin, zuerst xs:simpleContent
Zu verwenden. Details folgen ...
Ihre XML,
<price currency="euros">20000.00</price>
gilt für entweder der folgenden korrigierten XSDs:
<?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>
<?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>
price
von xs:string
In xs:decimal
, Dies ist jedoch nicht unbedingt erforderlich und war es auch nicht das eigentliche Problem.xs:decimal
Ändern, aber auch dies war nicht das eigentliche Problem. Das eigentliche Problem war, dass xs:complexType
Als Kind in XSD nicht direkt einen xs:extension
Haben kann; xs:simpleContent
Wird zuerst benötigt.
Eine verwandte Angelegenheit (die nicht gestellt 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.
<?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>
sie müssen einen Typ erstellen und das Attribut dieses Typs erstellen:
<xs:simpleType name="curr">
<xs:restriction base="xs:string">
<xs:enumeration value="pounds" />
<xs:enumeration value="euros" />
<xs:enumeration value="dollars" />
</xs:restriction>
</xs:simpleType>
dann:
<xs:complexType>
<xs:attribute name="currency" type="curr"/>
</xs:complexType>