1

XMLSpyがこれが有効であると考える理由を教えてください。参考までに、これはSQLクエリを指定します。ここでXML

 <sideBar title="LabelSearch">
  <searchLabel table="ID=*.companies">
   <filter accessRight="r">
    <and>
     <filterElement argument="companies.Type" operator="=" value="Client"/>
    </and>
   </filter>
  </searchLabel>
 </sideBar>

問題:「and」タグ内にfilterElementを1つだけ入れるのではなく、少なくとも2つ入れることを許可する必要があります。filterElementが1つしかない場合は、周囲の「and」タグなしで使用する必要があります。ここでXSD

 <xs:complexType name="filterGroupType">
  <xs:sequence>
   <xs:choice>
    <xs:element name="or" type="filterGroupOrType"/>
    <xs:element name="and" type="filterGroupAndType"/>
    <xs:element name="filterElement" type="filterType"/>
   </xs:choice>
  </xs:sequence>
  <xs:attribute name="accessRight" type="accessRightSimpleType" use="required"/>
 </xs:complexType>
 <xs:complexType name="filterGroupAndType">
  <xs:sequence minOccurs="2" maxOccurs="unbounded">
   <xs:element name="or" type="filterGroupOrType" minOccurs="0"/>
   <xs:element name="filterElement" type="filterType" minOccurs="0"/>
  </xs:sequence>
 </xs:complexType>
 <xs:complexType name="filterGroupOrType">
  <xs:sequence minOccurs="2" maxOccurs="unbounded">
   <xs:element name="and" type="filterGroupAndType" minOccurs="0"/>
   <xs:element name="filterElement" type="filterType" minOccurs="0"/>
  </xs:sequence>
 </xs:complexType>
 <xs:complexType name="filterType">
  <xs:attribute name="argument" type="xs:string" use="required"/>
  <xs:attribute name="operator" type="operatorSimpleType" use="required"/>
  <xs:attribute name="value" type="xs:anySimpleType"/>
  <xs:attribute name="field" type="fieldTitleSimpleType"/>
 </xs:complexType>

前もって感謝します。

4

3 に答える 3

3

簡単に言えば

  1. 要素にが含まれているため、ドキュメントは有効ですminOccurs="0"
  2. <xs:choice>の代わりに使用してください<xs:sequence>

もう少し長い答え。

@Damienが言ったように、スキーマのこの部分では「空の」シーケンスが許可されるため、XMLは有効です。

<xs:sequence minOccurs="2" maxOccurs="unbounded">
  <xs:element name="or" type="filterGroupOrType" minOccurs="0"/>
  <xs:element name="filterElement" type="filterType" minOccurs="0"/>
</xs:sequence>

With <xs:sequence minOccurs="2" maxOccurs="unbounded">Youは、「このシーケンスは少なくとも2回出現する必要がある」と定義します。同時に、<xs:element name="or" type="filterGroupOrType" minOccurs="0"/>シーケンス内のこれらの要素が存在しないようにします。比喩的に言えば、「食事を2回注文する必要がありますが、注文した食事を食べる必要はありません」と言っているようなものです。

代わりに、常に少なくとも2つの子要素が必要であり、これらの子を任意の順序で<filterElement>または要素にすることができる場合は、<or><xs:choice>minOccurs="1"

<xs:choice minOccurs="2" maxOccurs="unbounded">
  <xs:element name="or" type="filterGroupOrType" minOccurs="1"/>
  <xs:element name="filterElement" type="filterType" minOccurs="1"/>
</xs:choice>

のデフォルト値minOccursは1であるため、この値を省略して、コードをよりクリーンで短く保つことができます。<xs:choice>その子の1つを選択し、少なくともminOccurs回選択を繰り返します。選択肢の少なくとも1つが持つことができる場合minOccurs="0"、その選択肢は「空の」選択も許可します。

于 2010-09-10T17:13:54.240 に答える
2

filterElement に minOccurs="0" があります。したがって、1 つの filterElement は、filterElement として 0 回表示され、その後に filterElement が続きます。有効なシーケンス。おそらく、スキーマの xs:sequence と xs:element に minOccurs を混在させないでください...

于 2010-09-08T15:06:53.893 に答える
0

2 回発生する必要があるシーケンスがありますが、シーケンス内の要素はオプションです (minOccurs="0")。シーケンス自体は XML を表すものではなく、含めることができる要素とその順序を定義するだけです。その場合、完全に有効なシーケンスは空である可能性があります。

<xs:sequence> を <xs:choice> に置き換え、サブ要素で minOccurs を 1 に変更すると、要素がどの順序で表示されるかを気にせず、気にしないように見える場合に機能します。子で minOccurs を 1 に設定しない場合、有効な選択は 0 回発生する要素であり、XML は検証されます。子要素で minOccurs を 2 に設定すると、選択を 2 回行い、毎回 2 回発生する各子要素から選択するため、最低 4 つの要素が存在します。

于 2010-09-10T17:46:53.983 に答える