1

私が達成しようとしているのは、2 つの形式のいずれかを取ることができる XML ファイルを記述する XML スキーマの作成です。2 つの要素の間に共通する要素のセクションと、異なる小さなセクションがあります。何かのようなもの:

<Dessert>
  <Identifier> Hot Fudge Sundae </Identifier>
  <SaleDate> 2013-06-03 </SaleDate>
  <Duration> 2 </Duration>
  <Size> SuperScooper </Size>
</Dessert>

<Dessert>
  <Identifier> Dutch Apple Pie </Identifier>
  <SaleDate> 2013-06-03 </SaleDate>
  <Duration> 1 </Duration>
  <AlaMode> 1 </AlaMode>
  <IceCreamFlavor> Vanilla </IceCreamFlavor>
</Dessert>

つまり、アイスクリーム デザートにはSizeだけがあり、パイにはAlaModeインジケーターとIceCreamFlavor指定子があります。

私が達成したいのは、xs:choice指定子を使用して、DessertXML がどちらか一方 (SizeまたはAlaModeおよびIceCreamFlavor) を持つことを示して、それらを検証できるようにすることです。

私がやろうとしたことは、2つのタイプを作成し、次のようなことをすることです:

そして、次のようなことをします:

<xs:choice>
  <xs:element name="Sundae" type="SundaeType" />
  <xs:element name="Pie" type="PieType" />
</xs:choice>

しかし、もちろん、結果の XML は次のようなレイアウトになります。

<Dessert>
  <Identifier> Hot Fudge Sundae </Identifier>
  <SaleDate> 2013-06-03 </SaleDate>
  <Duration> 2 </Duration>
  <Sundae>
    <Size> SuperScooper </Size>
  <Sundae>
</Dessert>

これは既存のファイル構造と一致しません。

考えられるすべての要素を単純に結合して、そのようなxs:choiceものをなくすことはできますが、それは形式の期待を実際に伝えていません (たとえば、サンデーにAlaMode要素があることは有効ではありません)。

これを達成する方法はありますか?フィールドが 1 つだけ異なっていれば、xs:choice(おそらく) でこれを達成でき、その追加のレベルを持たないのではないかと思います。または、ここで何かが足りないだけかもしれません。

はい、レイアウトが最適ではないことは認識していますが、この時点で実際に変更できる既存の形式です。

4

1 に答える 1

2

ソース ドキュメント内の要素に順序を課すことを気にしない場合は、xs:sequence を使用してこれを機能させることができます。

<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="Dessert">
        <xs:sequence>
            <xs:element name="Identifier" type="xs:string"/>
            <xs:element name="SaleDate" type="xs:int"/>
            <xs:element name="Duration" type="xs:int"/>
            <xs:choice>
                <xs:element name="Size" type="xs:string"/>
                <xs:sequence>
                    <xs:element name="AlaMode" type="xs:int"/>
                    <xs:element name="IceCreamFlavor" type="xs:string"/>
                </xs:sequence>
            </xs:choice>

        </xs:sequence>
    </xs:complexType>

    <xs:element name="Dessert" type="Dessert"/>
</xs:schema>
于 2013-06-03T15:03:51.470 に答える