25

すべての子要素がオプションである「シーケンス」のようなスキーマの一部を設定しようとしていますが、要素の少なくとも 1 つが存在する必要があり、複数存在する可能性があります。

以下のことを試してみましたが、XMLSpy は「コンテンツ モデルには、一意に決定できない要素 <element name="DateConstant"> および <element name="DateConstant"> が含まれています。」 と不平を言います:

    <xs:choice>
        <xs:sequence>
            <xs:element name="DateConstant"/>
            <xs:element name="TimeConstant"/>
        </xs:sequence>
        <xs:element name="DateConstant"/>
        <xs:element name="TimeConstant"/>
    </xs:choice>

これを行うことはできますか (可能な場合、その方法は?)

明確化: 同じ名前の各要素を 1 つだけ許可したい。1 つの「DateConstant」および/または 1 つの「TimeConstant」を指定できますが、いずれかを 2 つ指定することはできません。ギズモの答えは私の要件と一致しますが、要素の数が多い場合は実用的ではありません。ハーストの答えでは、同じ名前の 2 つ以上の要素を使用できますが、これは望ましくありません。

4

3 に答える 3

26

これを試して:

<xs:choice>
  <xs:sequence>
    <xs:element name="Elem1" />
    <xs:element name="Elem2" minOccurs="0" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:sequence>
    <xs:element name="Elem2" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:element name="Elem3" />
</xs:choice>

そうすることで、最初の要素を強制的に選択し、残りはオプション、2 番目の要素と残りはオプション、3 番目の要素のいずれかを強制します。

これはあなたが望むことをするはずです、私は願っています。

もちろん、サブシーケンスをグループに配置して、見逃していることに気付いた場合に各シーケンスで要素が重複しないようにすることもできます。

于 2008-09-19T07:45:28.410 に答える
19

http://msdn.microsoft.com/en-us/library/aa468557.aspx#understandxsd_topic5にある MSDN の「 Understanding XML Schema」というタイトルの技術記事によると、選択定義 (コンポジター) 自体でminOccurs などの制約を利用できます。 :

「コンポジターでオカレンス制約を使用すると、グループ全体に適用されます」

(ネストされた複合型を使用するより洗練された例と AuthorType の例を参照してください)

あなたは、「要素の少なくとも 1 つが存在する必要があり、それらが複数存在する可能性がある」と要件を述べました。したがって、次のことを試すことをお勧めします。

<xs:choice minOccurs="1" maxOccurs="unbounded">
    <xs:element name="DateConstant" type="..."/>
    <xs:element name="TimeConstant" type="..."/>
</xs:choice>
于 2008-09-19T08:56:33.840 に答える
2

@ハースト、

残念ながら、元の質問を理解できませんでした。minOccurs = "0"を持つすべての要素がオプションとして含まれている場合、選択肢にminOccurs="1"を配置すると自動的に満たされます。

したがって、2つの完全にオプションの要素の1つの出現を正しく満たす要素がないため、元のポスターに必要な「少なくとも1つ」を説明できませんでした。

これまでのところ、minOccur / maxOccurは両方とも定義されているグループに関連しており、ノードの総数には関連していないため、これに対する解決策を見つけることができません。また、choice要素を使用して、同じ名前の要素を複数回定義したり、「あいまい」になったりすることもできません。特定のタイプの要素の代わりに参照を使用する例を見てきましたが、これはMicrosoftXSDパーサーに失敗すると思います。

<xs:choice minOccurs="1" maxOccurs="1">
  <xs:sequence minOccurs="1" maxOccurs="1">
    <xs:element name="Elem1" minOccurs="1" maxOccurs="1" />
    <xs:element name="Elem2" minOccurs="0" maxOccurs="1" />
  </xs:sequence>
  <xs:sequence >
    <xs:element name="Elem2" minOccurs="1" maxOccurs="1" />
  </xs:sequence>
</xs:choice>

ここで、最初のシーケンス(Elem1が必要ですが、オプションでElem2が必要な場合もあります)または2番目のシーケンス(Elem2が必要)があることがわかります。

したがって、これら2つの要素の「いずれか1つ以上」ができました。もちろん、考えられるすべての組み合わせに対して追加の選択肢を提供する必要があるため、オプションが増えるほど、これは指数関数的に複雑になります。

于 2013-01-14T03:47:39.517 に答える