9

次のスキーマ宣言があります。

<element name="container">
  <complexType>
    <choice minOccurs="0" maxOccurs="unbounded">
      <element name="action" minOccurs="0" maxOccurs="1" />
      <element name="query" minOccurs="0" maxOccurs="unbounded" />
      <element name="validator" minOccurs="0" maxOccurs="unbounded" />
    </choice>
  </complexType>
</element>

私は基本的に、必要な数のor要素<container>を含める必要がありますが、要素は 1 つだけ(そしておそらくなし) にします。<query><validator><action>

私が知る限り<choice>、技術的にはその選択を無制限に行うことができるため、 maxOccurs を設定することはできません(クエリとバリデータに制限がないため)。

ただし、この XML は Eclipse では有効であると見なされます (これは、Eclipse の検証では問題になる可能性がありますが、他のすべてのビットは正常に機能します)。

<container>
  <action id="action1" name="action1" />
  <action id="action2" name="action2" />
  <query id="query1" />
  <validator id="testValidator" />
</container>

明らかな何かが欠けているかどうかはわかりません。

4

1 に答える 1

15

現在のモデルは、(a) 1 つのaction要素またはなし、(b) 0 個以上のquery要素、または (c) 0 個以上のvalidator要素のいずれかの選択を定義し、その選択を 0 回以上繰り返すことを許可します。したがって、

<choice minOccurs="0" maxOccurs="unbounded">
  <element name="action"/>
  <element name="query"/>
  <element name="validator"/>
</choice>

actionそれぞれが、 a query、または要素である 0 個以上の要素の任意のシーケンスを許可しますvalidator

sequence策定する要件は、代わりに を使用することで満たすことができますchoice

<sequence>
  <element name="action" minOccurs="0" maxOccurs="1" />
  <element name="query" minOccurs="0" maxOccurs="unbounded" />
  <element name="validator" minOccurs="0" maxOccurs="unbounded" />
</sequence>

さまざまな種類の要素が発生する順序が情報を伝える場合があるため、それらを混在させる必要があります。その場合、問題は次の正規表現の問題に類似しています: 'a'、'q'、および 'v' で構成される文字列のセットを定義する正規表現を記述します。'a' は多くても 1 回出現します。これに対する明白な正規表現の 1 つが(q|v)*(a(q|v)?). 類似の XSD モデル グループは次のとおりです。

<sequence>
  <choice minOccurs="0" maxOccurs="unbounded">
    <element ref="query"/>
    <element ref="validator"/>
  </choice>
  <sequence minOccurs="0">
    <element name="action"/>
    <choice minOccurs="0" maxOccurs="unbounded">
      <element ref="query"/>
      <element ref="validator"/>
    </choice>
  </sequence>
</sequence>

(ローカル要素宣言から要素参照に変更して、それぞれ 2 回宣言する必要がないようにしましたqueryvalidator)

allXSD 1.1 では、グループで同じ効果が得られるはずです。

<all>
  <element name="action" minOccurs="0" maxOccurs="1" />
  <element name="query" minOccurs="0" maxOccurs="unbounded" />
  <element name="validator" minOccurs="0" maxOccurs="unbounded" />
</all>
于 2013-11-09T00:55:04.710 に答える