1

私はいくつかの XSD を書いていますが、<choice>タグの基本的な理解しかありません。あるセクションで動作していますが、attribute.

たとえば、すべての要素はオプションですが、一方がない場合はもう一方が必要です。これは要素が 2 つあれば問題ありませんが、私は 3 つ持っています。

以下のスキーマセクションを見てください。I can have messageor scanand not includeor I can have includeand not messageor scan.

       <xs:element name="messages">
        <xs:complexType>
          <xs:sequence>
            <xs:element minOccurs="0" ref="n:properties"/>

        <xs:choice>
          <xs:sequence>
            <xs:element ref="n:message" maxOccurs="unbounded"/>
            <xs:element ref="n:scan" minOccurs="0"/>
          </xs:sequence>

          <xs:element ref="n:scan"/>
        </xs:choice>

              <xs:attribute name="include"/>
          </xs:sequence>
        </xs:complexType>

  </xs:element>

現時点では、これは機能しmessageていますが、まだ選択肢がないため、明らかにscanエラーが発生します。include

誰かが私がどのように行うかのサンプルを見せてもらえます(message OR scan) OR includeか?

ありがとう

4

1 に答える 1

1

「AかBかCのいずれか」と言う最も簡単な方法は、A、B、およびCをすべて要素にして、次のように書くことです。

<xs:choice>
  <xs:element ref="A"/>
  <xs:element ref="B"/>
  <xs:element ref="C"/>
</xs:choice>

別の方法は、「別のファイルからのメッセージを含めることは、メッセージを指定することと同じではありません」と言って、 ( aまたは a のn:messagesいずれかを含む) と(別のファイルを指す) の両方を定義することです。親要素では、どちらかを許可します。または、抽象要素を定義し、 andをその置換グループに入れます。messagescann:message-inclusionmessage-thingyn:messagesn:message-inclusion

2 番目の代替案: XSD 1.1 に移行し、アサーションを使用してinclude、子が存在しない場合に属性が存在するというルールを適用します。

于 2012-08-21T17:35:47.163 に答える