4

親に要素名で一意の子要素があることを検証しようとしています。また、考えられる要素が少なくとも 1 つ存在することを検証する必要もあります。

<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>

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

4

1 に答える 1

1

XSD 1.0 に基づく一般的なソリューションは不可能です。フィールドの値が text(); を使用して評価されるという理由だけで、あなたのユニークなものがあなたが望むものを達成するとは思いません。そのため、タグの名前がこれに関与することはありません...

望むものに近いものを達成できるかもしれませんが、すべてのシナリオで機能するとは限らないか、優雅さや実現可能性に欠けるでしょう...

以下のアプローチは、一部の人にとってはエレガントとは見なされないかもしれません...それでも、同じ目的を果たすことができます。

たとえば、代わりに属性を使用して「タグ」名を取得すると、次のようになります。

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

次に、@type フィールドに独自の書き込みを行い、一連の Storage maxOccurs=whatever と組み合わせて、描写したものを厳密に取得します。

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

于 2012-05-10T21:52:44.137 に答える