古い質問に対する新しい答え
この古い質問に対する既存の回答はどれも、実際の問題に対処していません。
本当の問題は、XSDで子としてxs:complexType
直接持つことができないということでしたxs:extension
。修正はxs:simpleContent
最初に使用することです。詳細は次のとおりです...
あなたのXML、
<price currency="euros">20000.00</price>
次の修正されたXSDのいずれかに対して有効になります。
ローカルで定義された属性タイプ
<?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>
ノート
- 以下のよう@Paulでコメントし、これらはのコンテンツタイプに変更を行う
price
からxs:string
にするxs:decimal
が、これは厳密には必要ではないと本当の問題ではありませんでした。
- @ user998692が回答したように、通貨の定義を分離してに変更することもできますが
xs:decimal
、これも実際の問題ではありませんでした。
本当の問題は、XSDで子としてxs:complexType
直接持つことができないということでした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>