0

要素の順序が強制されない XSD スキーマに取り組んでいます。つまり、要素は任意の順序で表示できます。一部の要素はオプションであり、一部は必須です。私の知る限り、xs:sequence はこの種の状況に適していますが、xs:sequence は要素の順序を強制するため、強制に関しては非常に緩和された xs:choice しか残されていません。たとえば、次の例を考えてみましょう。

<p>
      <c1>can appear 0 to infinite # of times</c1>
      <c2>must appear exactly once</c2>
      <c1>here the optional element appears again</c1>
</p>

私のXSDは次のようになります。

<xs:element name="p">
            <xs:complexType>
                         <xs:choice maxOccurs="unbounded">
                                <xs:element name="c1" minOccurs="0" maxOccurs="unbounded" />
                                <xs:element name="c2" minOccurs="1" maxOccurs="1" />
                         </xs:choice>
            </xs:complexType>

ただし、上記の XSD は、要素「c2」が 1 回だけ出現することを強制しません。要素 "c2" が完全に存在しないか、2 回以上表示されていても、XML は有効であると見なされます。

私が許可できる方法は本当にありますか:

  • 任意の順序の要素と
  • xs:choice? 内にオプション要素と必須要素の両方を混在させますか?
4

2 に答える 2

1

このトピックが議論されたいくつかの場所の 1 つは、この StackOverflow questionです。

c1 と c2 の単純な正規言語が必要です。作成するオートマトンには 2 つの状態があります。入力で c2 が検出されず、c1 と c2 が受け入れられる初期状態と、c2 が検出され、c1 のみが検出される 2 番目の状態です。受け入れました。(c1*c2c1*)この言語は、正規表現またはコンテンツ モデルで記述できます。

<xs:sequence>
  <xs:element ref="c1" minOccurs="0" maxOccurs="unbounded"/>
  <xs:element ref="c2"/>
  <xs:element ref="c1" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>

質問のより一般的な形式 (2 つの必須要素を含む) は、関連する SO の質問に対するこの回答で説明されています。必要な要素の数が増えると、コンテンツ モデルは組み合わせ爆発を経験します。そのような場合、XSD 1.1 の all-groups の方がはるかに便利です。

于 2013-11-12T17:23:26.190 に答える
1

どちらxs:sequencexs:choiceこの仕事には適していません。必要に応じxs:allて - これにより、任意の順序で表示できる要素のリストを指定できます。XSD 1.0 では、要素に応じて、各要素が 0 回または 1 回表示されminOccursます。XSD 1.1 では、maxOccurs を指定して複数の外観を許可することもできます。

于 2013-11-12T09:05:44.933 に答える