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


86

私は次のXMLタグを持っています

<price currency="euros">20000.00</price>

通貨属性を次のいずれかに制限するにはどうすればよいですか。

  • ユーロ
  • ポンド
  • ドル

そして、価格は2倍になりますか?

両方でタイプしようとするとエラーが発生します。これまでのところ、次のようになっています。

<xs:element name="price">
    <xs:complexType>
        <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:complexType>
</xs:element>

1
これを行う場合は、<xs:attribute>要素からtype = "xs:string"も削除する必要があります。simpleTypeまたはcomplexTypeが存在する場合、タイプを指定することはできません。
Sal

回答:


117

価格定義から数値が欠落しているようです。次のことを試してください。

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

3
@kjhughesが回答したように、<xs:extensionは直接の子になることはできません<xs:complexTypeが、代わりに<xs:complexContentまたはで含める必要があります<xs:simpleContent
HankCa 2016年

22

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

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

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

8

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

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

こんにちは、残念ながら、これでは、価格タイプを「double」に制限すると同時に、「currency」属性の制限列挙を制限することはできません
Luke

-2
<xs:element name="price" type="decimal">
<xs:attribute name="currency" type="xs:string" value="(euros|pounds|dollars)" /> 
</element> 

これにより、列挙の必要が完全になくなります。必要に応じて、タイプをdoubleに変更できます。


@valueには表示できませんxs:attributexs:attributeの子として表示することはできませんxs:element。必要なxs:名前空間プレフィックスは省略されています。 この答えはめちゃくちゃなので、削除する必要があります。
kjhughes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.