2012-01-15 14 views
0

私は次のような「家」の要素を含んでいるXML & XSDカップリングを持っている:私はタイプのすべての住宅「コテージ」は必須タグを持たなければならないというのが私のXSDを経由して強制するXSDでは、親要素のコンテンツに基づいて必須子要素を設定できますか?

<root> 
... 
<House> 
    <id>1</id> 
    <type>Cottage</type> 
    <imageSrc> image.jpg </imageSrc> 
</House> 
<House> 
    <id>2</id> 
    <type>Private</type> 
</House>  

が、他の家はしない。 (あるいは他の方法のaruond - のみ「のプライベートショーは」ないを行うこれを行う方法はあり

+1

XSDではこれができません。 –

+0

修正:XSD 1.0ではこれを行うことができません。 XSD 1.1は可能です。 –

答えて

2

あなたがの能力を超えているこれらの追加の検証ルールを表現するためにSchematronのようなものを使用して検討する必要があります。? XMLスキーマのSchematronは、XML文書の中に存在しなければならないパターンに関するアサーションを表現することを可能にするオープン(ISO)標準です。たとえば、次のような制約表現するためにそれを使用することができます。。要素Aがある場合

  • を現在、要素Bが禁止されている。ABが兄弟である場合は、THIを行うことができますXMLスキーマでxs:choiceを使用していますが、2つの要素が兄弟でない場合、XMLスキーマではこのアプローチは機能しません。
  • 要素Aが特定の値を持つ属性を持っている場合、それは、子要素Bが含まれている必要があります。
  • 要素A要素BCの合計に等しくなければなりません。あなたの具体的な例では

、私は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プロセッサを使用して実装できます。

0

XSDがこの動作をサポートしていないのは本当ですが、必須ノードと不要ノードの2つのハウスタイプを定義できます。

関連する問題