私はこれが関係していると信じていますがkeyref
、確かではありません。
たとえば、myElement1 と myElement2 があるとします。XML ファイルに myElement2 がない場合、myElement1 が存在する必要があります。それ以外の場合はオプションです。
XSD ファイルでこのタイプの検証を強制する方法はありますか?
私はこれが関係していると信じていますがkeyref
、確かではありません。
たとえば、myElement1 と myElement2 があるとします。XML ファイルに myElement2 がない場合、myElement1 が存在する必要があります。それ以外の場合はオプションです。
XSD ファイルでこのタイプの検証を強制する方法はありますか?
同様の質問が何度か寄せられています..スタックオーバーフローまたは技術ブログで..
しかし、答えは常に不可能です。
のような場合:
(a) 他の要素/属性
の値または存在に応じて要素を検証する (b) 値または他の要素/属性の存在に応じて要素の値を
検証する (c) 値または他の要素/属性の存在に応じて属性を検証する他の要素/属性
(d) 同じスコープの下で異なるタイプ/データ型を持つ同じ名前の要素/属性を定義する
(e) 値または他の要素/属性の存在に基づいて子要素を検証する
上記のすべてのケースを達成することはできません..
しかし、何らかの変換を実装できれば、助けを得ることができます。私が言いたいのは、「最初に変換を行い、必要に応じて XML を変更し、
例 :: 特定のフィールドに何らかの値が期待される場合.. 条件が満たされている場合は XML をそのまま渡し、満たされていない場合は渡さない.. 次のブロックで XSD が検証され、明らかにエラーが発生する:)カスタム検証が欠落していることがわかります..
とにかく、意図はデータに従ってxmlをブロックまたは渡すことです..そしてそれはあなたがしていることです..
注: Schematronは、最近よく実践されています。チュートリアルは次のとおりです。http://zvon.org/xxl/SchematronTutorial/General/contents.html
私が提案するのは、以下に定義されているケースごとに XSD を作成することです。
次のような場合:
そして、そのための独自の XML を作成します。