あなたがの能力を超えているこれらの追加の検証ルールを表現するためにSchematronのようなものを使用して検討する必要があります。? XMLスキーマのSchematronは、XML文書の中に存在しなければならないパターンに関するアサーションを表現することを可能にするオープン(ISO)標準です。たとえば、次のような制約表現するためにそれを使用することができます。。要素A
がある場合
- を現在、要素
B
が禁止されている。A
とB
が兄弟である場合は、THIを行うことができますXMLスキーマでxs:choice
を使用していますが、2つの要素が兄弟でない場合、XMLスキーマではこのアプローチは機能しません。
- 要素
A
が特定の値を持つ属性を持っている場合、それは、子要素B
が含まれている必要があります。
- 要素
A
要素B
とC
の合計に等しくなければなりません。あなたの具体的な例では
、私はimageSrc
は、その存在があなたがタイプの住宅に「コテージ」を強制し、他人に禁止したい必須タグであると仮定するつもりです。
これらのアサーションを表現するための単純なSchematronのスキーマの例である:ここ
<schema xmlns="http://purl.oclc.org/dsdl/schematron">
<pattern>
<!-- Houses of type 'Cottage' must contain an imageSrc element -->
<rule context = "/root/House[type/text() = 'Cottage']">
<assert test = "imageSrc">Cottages must have an image</assert>
</rule>
<!-- Houses not of type 'Cottage' must not contain an imageSrc element -->
<rule context = "/root/House[type/text() != 'Cottage']">
<assert test = "not(imageSrc)">Non-cottages must not have an image</assert>
</rule>
</pattern>
</schema>
、私は2つの別々のルール、あなたの条件の2つの部分の各々のための1つのようなパターンを表現しました。
各rule
はXPath式ですcontext
属性を持っています。この式が真と評価されるとき、ルールは「発生する」。したがって、最初のルールはHouse
要素で発生し、テキスト内容が 'Cottage'に等しいtype
子要素を持ちます。
ルールが起動すると、assert
要素のtest
属性を評価することで、アサーションが確認されます。これもXPath式ですが、テスト式を評価するためのコンテキストノードはrule
要素(この場合はHouse
)と一致するノードです。テスト式が真と評価されると、アサーションは合格(すなわち、このアサーションに関してドキュメントが有効である)になる。 falseと評価された場合、アサーションは失敗します。 assert
要素のテキスト内容は、通常エンドユーザーに渡すことができるアサーションの人間が判読可能な記述です。 Schematronは、追加の技術メッセージをアサーションにリンクするための追加の機能(「診断」と呼ばれる)も提供します。 Schematronの
A公的に入手可能なXSLTベースの実装は、http://www.schematron.com/implementation.htmlで入手可能です。典型的な検証パイプラインは、文書の基本構造要件(例えば、要素階層、カーディナリティ、データ型、パターンなど)を定義するXMLスキーマに対して文書をまず検証することを含む。次に、ドキュメントがこの基本レベルの検証に合格したら、ドキュメントをSchematronスキーマに対して検証し、追加のパターンベースの制約を検証します。このパイプラインは、プログラム的に、または(例えば)バッチファイル、AntスクリプトまたはXProcプロセッサを使用して実装できます。
XSDではこれができません。 –
修正:XSD 1.0ではこれを行うことができません。 XSD 1.1は可能です。 –