2012-05-10 18 views
4

親が要素名で一意の子要素を持つことを検証しようとしています。 また、少なくとも1つの可能な要素が存在することを検証する必要があります。XMLスキーマ固有の子要素

<StorageTypes> 
    <Status/> 
    <Warning/> 
    <Error/>    
</StorageTypes> 

は有効であるだろうが、

<StorageTypes> 
    <Status/> 
    <Status/> 
    <Warning/> 
    <Error/>    
</StorageTypes> 

<StorageTypes>    
</StorageTypes> 

は無効になります。

xs:uniqueを使用して現在のノードを選択しようとしましたが、フィールド要素で要素を一般的に選択できませんでした。

私が探していることは以下の通りですが、私が探している堅牢な解決策ではありません。私はすべての変更のxpathを変更して、より多くのタイプを追加できるようにしたいと考えています。

<element ect.> 
    <xs:unique name="something"> 
     <xs:selector xpath="."/> 
     <xs:field xpath="Status"/> 
     <xs:field xpath="Warning"/> 
     <xs:field xpath="Error"/> 
    </xs:unique> 
</element> 

これは可能ですか?これはいい練習ですか?アドバイスをいただければ幸いです。

答えて

1

XSD 1.0に基づく一般的な解決策はありません。フィールドの値がtext()を使って評価されているため、あなたのユニークさがあなたの望むものを達成するとは思えません。タグの名前はこれで決して役割を果たしません...

あなたが望むものに近いものを達成できるかもしれませんが、それはすべてのシナリオで機能しないかもしれません。実現可能性...

以下のアプローチは、いくつかによってエレガントであるとは考えられないかもしれません...それにもかかわらず、同じ目的を果たす可能性があります。例えばのために

、代わりにあなたがのように「タグ」の名前をキャプチャするために属性を使用する場合:

<StorageTypes> 
    <Storage type="Status"/> 
    <Storage type="Warning"/> 
    <Storage type="Error"/> 
</StorageTypes> 

次に示します何のmaxOccurs =は、ストレージの配列に結合し、@typeフィールドに独自のを書きますあなたは厳密にあなたが描いたものをあなたに与えます。

実際に複雑なコンテンツを持つ要素を探している場合や、属性が許可されていない場合は、同じ効果の代替グループを使用できます。

+0

ありがとうございました。私は代替グループを詳しく見ていきます。私はあなたが提示したものと同様の解決策を持っていますが、列挙を使用しています。私たちは、フレームワークスキーマを変更することなく、将来のスキーマによる拡張を可能にする、より汎用的なものを探していました。 – gettingSmarter

関連する問題