次のような定義が実際に必要になるようです。
<!-- This is an INVALID example -->
<xs:element name="param">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="key" type="xs:string" fixed="age" />
<xs:element name="value" type="xs:decimal" />
</xs:sequence>
<xs:sequence>
<xs:element name="key" type="xs:string" fixed="smart" />
<xs:element name="value" type="xs:boolean" />
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:element>
残念ながら、そのようなコードは無効なXMLスキーマファイルになります。
構文は正しいですが、セマンティクスはスキーマ規則に違反しています。同じ名前で同じスコープの要素は、同じタイプである必要があります。この場合、特に、<value>
要素の子であるすべての要素<param>
が同じタイプでなければならないことを意味します。
正式には、これはスキーマコンポーネント制約:要素宣言の一貫性です。次のスキーマコンポーネント制約も参照してください。通常、要素タイプをドキュメント内の他の値やシーケンスの残りの項目に関する情報に依存させることはできません。
アップデート
これを完全に忘れましたが、純粋にスキーマで定義するのではなく、インスタンスドキュメントで目的のタイプを指定すると、必要な制約を取得できるはずです。これは、要素にxsi:type
属性を追加することで実行できます。<value>
例
<param>
<key>age</key>
<value xsi:type="xs:decimal">10</value>
</param>
<param>
<key>smart</key>
<value xsi:type="xs:boolean">true</value>
</param>
もちろん、これはXML生成プロセスを変更する必要があるため、少し不便です。<key>
また、と定義さxsi:type
れたペアが一致することを自動的に保証するものではありません。