1

XML スキーマに苦労していて、画面をじっと見ていてもうまくいきません。スキーマを作成しようとしている XML は次のようになります。

<root>
   <command>FOO|BAR|BLOOP</command>
   <parameters>
       <param1>val</param1>
       <param2>val</param2>
   </parameters>
<root>

コマンド値が FOO、BAR、BLOOP のいずれであるかに応じて、parameters-tag に異なるパラメーターのセットを含める必要があり、空の場合があります。特定のコマンドに表示する必要があるパラメーターのセットが定義されており、一部のコマンド名には同じパラメーターのセットがあります。

私がやっていることは、すべてのコマンドのタイプを作成することです.1つはFOO用、1つはBAR用、もう1つはBLOOP用であり、それらのタイプにそれらが使用するパラメーターを入れることができます。

ただし、次のようなことをすると:

<xs:element name="root">
  <xs:complexType>
    <xs:element name="myCommand" type="myCommandType"/>
  </xs:complexType>
</xs:element>

これにより、実際にはルート要素間の部分をそのコマンドが必要とするもので埋めたいだけの場合に、すべてのコマンドタイプの名前を持つ特別な要素が作成されます。

これについて最善の方法についての手がかりはありますか?

コマンドごとにスキーマを作成した方がよいでしょうか、それともすべてを同じスキーマに入れることができますか?

4

2 に答える 2

2

まず、一般に、あるタグ (<parameters>タグ) の内容に応じて別のタグ (タグ)のタイプを変更することはできません<command>。それを行うには醜くて複雑な方法があるかもしれませんが、私は簡単な解決策をお勧めします.

可能であれば、XML を次のように再構築する必要があります。

<root>
  <foo-command>
    <param1>val</param1>
    <param2>val</param2>
    <param3>val</param3>
  </foo-command>
</root>

これはスキーマで簡単に実行でき<root>ます。コマンドの選択肢となるようにコンテンツを定義し、パラメータ定義を含むそれぞれの複合型を作成します。

これは次のようになります。

<element name="root">
    <complexType>
        <choice>
            <element name="foo-command" type="tns:foo-command-type"/>
            <element name="bar-command" type="tns:bar-command-type"/>
            ...
        </choice>
    </complexType>
</element>

<complexType name="foo-command-type">
    <sequence>
        <element name="param1" type="boolean"/>
        <element name="param2" type="int"/>
        ...
    </sequence>
</complexType>
<complexType name="bar-command-type">
    ...
</complexType>
...
于 2012-10-18T14:09:31.503 に答える
2

この問題はしばしば「共起制約」という名前で呼ばれ、簡単な解決策がないという XSD 1.0 のよく知られた制限です。

XSD 1.1 には、「条件付き型の割り当て」と呼ばれる新しい機能があり、まさにあなたが望むことを行います。XSD 1.1 は現在、Xerces と Saxon に実装されています。

于 2012-10-18T17:06:13.073 に答える