1

次のルールを適用するXSD(v1.0ベース)を定義したいと思います...

parent1要素があり、次の子要素child1child2、およびchild3を持つことができます。

  • parent1はchild1の0-1を持つことができます
  • parent1はchild2の0-1を持つことができます
  • parent1は0を持つことができます-child3の無制限

アイテムの順序は重要ではありません。例えば

<parent1>
  <child3/>
  <child1/>
  <child2/>
  <child3/>
  <child3/>
</parent1>

近づきましたが、葉巻はありません。私が得ることができる最も近いものは、最小値と最大値の強制ですが、順序は強制されます。

<xsd:element name="parent1" minOccurs="0" maxOccurs="unbounded">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="child1" minOccurs="0" maxOccurs="1"/>
      <xsd:element name="child2" minOccurs="0" maxOccurs="1" />
      <xsd:element name="child3" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

allの代わりにを使用してみましたが、子要素の場合は1にsequence制限されます。シーケンスを置き換えるためにchoicemaxOccurs使用してみましたが、それは下に持つことができる要素の数を制限するものではありません。maxOccurschild1child2parent1

編集:これはXSDv1.0用です

XSD 1.1で機能するソリューションを見つけましたが、Eclipseのようなものでどれほどサポートされているかがわかったら、 1.0を使い続けます。

4

3 に答える 3

1

ハンティンが言うように、これはXSD1.0では組み合わせて厄介です。

XSD 1.1では、xs:allモデルグループのパーティクルにmaxOccurs属性を設定できるため、問題は解決されます。XSD 1.1は現在、SaxonとXercesに実装されています。

于 2012-09-18T08:20:31.763 に答える
1

特に難しいというわけではありませんが、Michael Kay が指摘したように、面倒で、がっかりするほど冗長です。Jeffrey Hantin の例を簡潔にするために DTD 表記に変換し、要素名にc1, c2, およびc3(再び簡潔にするために) を使用すると、解決策は次のようになります。

(c3*, ((c1, c3*, (c2, c3*)?) | (c2, c3*, (c1, c3*)?))?)

子要素のシーケンスが情報を伝える場合、もちろん、順序付けのこのすべての柔軟性にとって重要です。シーケンスが何の情報も伝えない場合、柔軟性を許可する必要はなく、通常は OP の元のソリューションが優先されます。

于 2012-09-18T16:43:37.970 に答える
0

XML スキーマ 1.0 でこれを行うには、次のような結果をxs:all得るために、パーティクルを一連の選択ツリー (各選択の各分岐に固有のオプションではない最初の要素がある)に「展開」する必要があります。

編集:要件に対する私の認識を修正し、結果として冗長性を大幅に削減しました。冗長性をさらに減らすためのいくつかの最適化も実行されました。空のブランチを含む選択肢は、選択肢で空のブランチに変換さminOccurs=0れ、その変換で選択肢が 1 つしか残っていない場合は、選択肢自体が省略さminOccurs="0"れ、その唯一の子に転送されました。

<xs:sequence>
  <xs:element name="nationality" minOccurs="0" maxOccurs="unbounded" />
  <xs:choice minOccurs="0">
    <xs:sequence>
      <xs:element name="name" />
      <xs:element name="nationality" minOccurs="0" maxOccurs="unbounded" />
      <xs:sequence minOccurs="0">
        <xs:element name="email" />
        <xs:element name="nationality" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:sequence>
    <xs:sequence>
      <xs:element name="email">
      <xs:element name="nationality" minOccurs="0" maxOccurs="unbounded" />
      <xs:sequence minOccurs="0">
        <xs:element name="name" />
        <xs:element name="nationality" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:sequence>
  </xs:choice>
</xs:sequence>
于 2012-09-18T03:16:57.317 に答える