9

allタグの中にchoiceタグを入れることはできません。では、この機能を利用するための回避策はありますか? たとえば、次<settings>のようなタグがあります。

<settings>
    <logging />
    <sending />
    <useonly />
</settings>

または次のようなもの

<settings>
    <logging />
    <notuseonly />
    <sending />
</settings>

<useonly>だから、順序は重要ではありませんが、一緒に<notuseonly>現れないようにしたいと思います。許可されている場合、XSD では次のようになります。

  <xs:all>
    <xs:element minOccurs="0" maxOccurs="1" ref="sending" />
    <xs:element minOccurs="0" maxOccurs="1" ref="logging" />
    <xs:choice>
         <xs:element minOccurs="0" maxOccurs="1" ref ="useonly" />
         <xs:element minOccurs="0" maxOccurs="1" ref ="notuseonly" />
     </xs:choice>
  </xs:all>

何かご意見は?

4

1 に答える 1

10

このリンクを確認してください: http://www.w3.org/wiki/Needs_choice_inside_all

提案された解決策を要約します。

1 つの解決策は、変更可能な要素を別の要素にラップすることです。

  <xsd:all>
   <xsd:element minOccurs="0" maxOccurs="1" ref="sending" />
   <xsd:element minOccurs="0" maxOccurs="1" ref="logging"/>
   <xsd:element minOccurs="0" maxOccurs="1" ref ="usetype"/>
  </xsd:all>

 <xsd:element name="usetype">
  <xsd:complexType>
   <xsd:choice>
    <xsd:element ref="useonly"/>
    <xsd:element ref="notuseonly"/>
   </xsd:choice>
  </xsd:complexType>
 </xsd:element>

もう 1 つは、置換グループを使用することです。

  <xsd:all>
   <xsd:element ref="sending"/>
   <xsd:element ref="logging"/>
   <xsd:element ref="usetype"/>
  </xsd:all>
 </xsd:complexType>
 <xsd:element name="usetype" abstract="true"/>
 <xsd:element name="useonly" substitutionGroup="usetype"> ... </xsd:element>
 <xsd:element name="notuseonly" substitutionGroup="usetype"> ... </xsd:element>
于 2012-07-17T06:29:45.903 に答える