web-dev-qa-db-ja.com

XMLスキーマ列挙によって属性を制限する方法

次の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>
82
Luke

数値が価格定義から欠落しているようです。以下を試してください:

<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>
111
user998692

古い質問に対する新しい答え

この古い質問に対する既存の回答のどれも実際の問題に対処していません。

本当の問題は、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>

ノート

  • @ Paulによるコメント のように、これらはpriceのコンテンツタイプをxs:stringからxs:decimalに変更しますが、これは厳密には必要ではなく、実際の問題ではありませんでした。
  • @ user998692による回答 のように、通貨の定義を分離し、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>
21
kjhughes

タイプを作成し、そのタイプの属性を作成する必要があります。

<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>
7
A.B.Cade