SGML コミュニティでは、探している値は (要素が含まれる場合) 「完全修飾汎用識別子」または FQGI と呼ばれていました。なぜなら '。' は XML および SGML リファレンスの具体的な構文で有効な名前文字です。FQGI は通常、ドットを書く場所にスラッシュを付けて書かれます。(ここでは FQGI という用語を拡張し、要素ではなく属性を表す文字列を含め、関心のある文字列を表すために使用します。)
特定のスキーマに対して有効なドキュメントに表示される可能性のあるすべての FQGI のセットを見つけるプロセスに対して確立された用語を知りません。多くの XML ボキャブラリーでは、これは無限集合であることに注意してください。終了するプロセスが必要な場合は、可能なすべての FQGI の有限サブセットを特定する必要があります。
ただし、従う必要があるプロセスは比較的単純です。単純なバージョンは次のように実行されます。
関心のあるスキーマが複数のスキーマ ドキュメントにわたって定義されている場合は、それらをすべて 1 つの XML ドキュメント (複数の xs:schema 子を持つラッパー) または XSLT または XQuery を使用して処理できるスキーマ ドキュメントの 1 つのコレクションにまとめます。
開始したい要素宣言と属性宣言のセットを特定します。(あなたの場合、このセットはおそらく foo の最上位の要素宣言で構成されています。) このセットの各項目について、その名前と型を書き留めます。この文字列と型のペアのセットを S と呼びます。
集合 S を集合 S' にコピーします。
セット S'' を次の方法で作成します。空の S'' で開始し、S' 内の各アイテムについて、N を FQGI とし、T をアイテムで指定された型とし、次のようにします。
(a) N が属性を表す場合、何もしません。
(b) N が要素を表す場合、そのような要素に表示される属性のセットを特定します。そのような属性ごとに、そのタイプ T2 を識別し、N、スラッシュ、アットマーク、および属性の拡張名を連結して文字列 N2 を作成します。ペア (N2、T2) を S'' に追加します。
(c) N が要素を表す場合、(i) T のコンテンツ モデルに現れる、(ii) T のコンテンツ モデルのワイルドカードに一致する、または (iii) で指定された要素に置換可能な要素のセットを見つけます。 (i) または (ii)。そのような可能な子ごとに、子のタイプ T3 を識別し、N、「/」、および可能な子の拡張名を連結して文字列 N3 を作成します。ペア (N3、T3) を S'' に追加します。
S'' が空の場合、答えは集合 S と集合 S' の和集合にあります。そうでない場合、(新しい) S を S と S' の結合とし、(新しい) S' を S'' と等しくし、ステップ 4 に進みます。
少し考えると、ワイルドカードに一致する名前のセットは無限にあることがわかります。そのため、ステップ 4(c) のリスト (ii) は完全には処理できません。リストの有限サブセットをさまざまな方法で選択できます。どちらを選択するかは、FQGI のリストが何のために必要かによって異なります。
もう少し考えてみると、ボキャブラリ内の要素が独自の子孫として表示される場合 (HTML の div 要素や li 要素など)、概説されているプロセスは決して終了しないことがわかります。繰り返しになりますが、4(c) で生成されたペアのセットをトリミングして終了を保証するさまざまな方法があります。
これを行うライブラリを私は知りません。おそらく、可能な FQGI のセットが、興味深い XML ボキャブラリに対して有限であることがめったにないためです。XQuery エンジンまたは XSLT スタイルシートで作業を行うのは簡単です。