13


6

私はxs:keyとxs:keyrefの定義を使ってXMLスキーマにいくつかの外部キー制約を定義しようとしています。 次のようにして、文書の構造を階層的にします。


各親は、parentKeyによって定義された(グローバルに)固有のキーを持ちます。 各子は、childKeyによって定義されたキーを持ちます。ただし、childKeyは、それを含むparent_の範囲内でのみ一意です。

特定の親と子への外部キー参照を持つ参照元のリストがあります。

キーを正しい要素に配置するだけで、必要に応じてキーを定義できます。ルート要素に対するparentKey制約と、親要素に対するchildKey制約です。 keyrefをparentKeyに問題なく定義することもできます。

childKeyにkeyrefを定義しようとすると問題が発生します。 ルート要素の単純なkeyrefをchildKeyに定義しようとしましたが、適切な親サブツリーの下の子要素だけを選択する方法がないため、これは機能しません。 (少なくともEclipseバリデータは、ドキュメント内の_last_親サブツリーの内容に対して単に検証します…​)。

それから私は(rootで)複合キーを定義しようとしました。

  • セレクタ=親

  • field = @parentKey

  • field = child / @ childKey

親の下に複数の子が定義されていると、これは失敗します。 これは、http://www.w3.org/TR/xmlschema11-1/ [XSD 1.1 spec]、セクション3.11.4、item 3に基づく正しい動作です。フィールド定義ごと。

繰り返しになりますが、childKeysをグローバルに一意にすることを強制する場合、これは実装が簡単です。問題は_locally_ unique childKeysを参照することです。

どんなXSDマスターにもアイディアがありますか?

参考のために、これは失敗したchildKey keyrefがコメントアウトされたサンプルXSDです。


3 Answer


2


子供から親への言及はどうですか? 多くの子がある場合でも、親は1人しかいないため、子キーがその親内でのみ一意である場合でも、(parent、child)を組み合わせるとグローバルに一意なキーが作成されます。


これはxmllintでは機能しません、たとえ仕様がフィールドに対してこれを明示的に許可しないように見えなくても - セレクターだけのために: 3.11.4 、(2)は_selector_を先祖にすることはできません(コンテキストノードまたは子孫にしかなれません)。

ああ、これが棺桶の中の爪です(特定の構文を見てください):許されるXPath式は非常に限られていて、単に ".."を含めないでくださいc-fields-xpaths

それで、すみません、これはあなたの質問に答えない、しかし多分それはあなたにいくつかのアイデアを与えるでしょう。


1


次のように、parentKeyが各子に含まれるように、XMLフォーマットを変更するのが醜い解決策です。


私はあなたの状況は非常に合法的だと思います、そして私はこれを行う方法があると期待します - なぜxml-devメーリングリストを試してみませんか? 私が最後に確認したのは騒々しくなりましたが、xmlの作成者の中にはまだハングアウトしている人がいます。


0


私は同じような質問をしました: 複数のフィールドを持つXMLスキーマキー

私にとって最良のアプローチは、2つのフィールドを持つキーを適用するのではなく、範囲を地域によって決定できるようにXMLを並べ替えることです。

あなたのシナリオでは、親の中に参照元を移動すると、スコープが適切な子を参照するように設定できるようになります。 その後、参照元要素が外部スコープを参照する必要のある要素に参照するようにします。

あなたの問題は少し抽象化されているように見えるので、これが許容できる解決策であるかどうかを判断するのは少し難しいです。 私の質問に記載されている私の問題では、私は質問、回答、そしてユーザーの回答を扱っていました。 私はもともと、ユーザーの回答が実際に有効な回答であるかどうかを検証しようとしていました。私の最初のアプローチはあなたが使っているのと同じテクニックを含みました。 私の最終的な解決策は、回答を質問の内側に移動してからユーザーを参照することでした。

私のXMLの前に:

はいホワイトいいえブルーあなたは赤が好きですか? はいいいえあなたの好きな色は何ですか? レッドブルーホワイトイエロー

私のXML AFTER:

あなたは赤が好きですか? はいいいえはいいいえあなたの好きな色は何ですか? 赤青白黄白青