次のXMLタグがあります
<price currency="euros">20000.00</price>
通貨属性を次のいずれかに制限するにはどうすればよいですか?
そして、価格は倍になりますか?
両方で型を入力しようとするとエラーが発生するだけです。
<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>
数値が価格定義から欠落しているようです。以下を試してください:
<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>
この古い質問に対する既存の回答のどれも実際の問題に対処していません。
本当の問題は、xs:complexType
が直接xs:extension
を持つことができないということでしたXSDの子。修正は、最初にxs:simpleContent
を使用することです。詳細は次のとおりです...
あなたのXML、
<price currency="euros">20000.00</price>
以下の修正済みXSDのeitherに対して有効です。
<?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
のコンテンツタイプをxs:string
からxs:decimal
に変更しますが、これは厳密には必要ではなく、実際の問題ではありませんでした。xs:decimal
に変更できますが、これも実際の問題ではありませんでした。実際の問題は、xs:complexType
がXSDの子としてxs:extension
を直接持つことができないことでした。 xs:simpleContent
が最初に必要です。
関連事項(質問されていないが、他の回答を混同している可能性がある):
属性を持っている場合、price
を制限するにはどうすればよいですか?
この場合、priceType
の個別のグローバル定義が必要になります。ローカルの型定義のみでこれを行うことはできません。
<?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>
タイプを作成し、そのタイプの属性を作成する必要があります。
<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:complexType>
<xs:attribute name="currency" type="curr"/>
</xs:complexType>