次の XML ドキュメントがあるとします。
<root>
<genres>
<genre name="comedy" />
<genre name="academic" />
</genres>
<authors>
<author name="Thomson">
<writings>
<writing genre="academic">The text book</writing>
<writing genre="comedy">The worst comedy</writing>
<writings>
</author>
</authors>
<readers>
<reader name="Phil">
<read writenBy="Thomson">The text book</read>
</reader>
<reader name="John" />
</readers>
</root>
ご覧のとおり、'reader' 要素には 'read' 子要素がない場合があります。
ただし、次のようなエントリがないことを確認する検証プロセスが必要です。
<reader name="Paul">
<read writtenBy="Thomson">A writing the author never wrote</read>
</reader>
私ができることは、キーとキーリファレンスを使用して、以前に定義された属性に基づいて属性が取り得る値を制限することです (受け入れられた回答を参照)。これに基づいて、'writtenBy' 属性が実際に著者の名前を参照しているか、または執筆のジャンル属性が以前に定義されたジャンルに由来するかを確認できます。
XSDドキュメントに列挙をハードコーディングできることは知っています(受け入れられた回答を参照)。
また、アサーション (XSD 1.1) を使用して、XML に含まれる情報に基づいてより柔軟な列挙を行うこともできます (受け入れられた回答を参照)。
しかし、これらのアプローチはハードコードされているため、使用できません。現在属性値で行っているように、要素値に対して同様のチェックを行う方法はありますか?