2016-03-21 22 views
3

Schematronを使用して存在しない要素を探すのは私だけか、それとも不可能ですか?私はまた、これについてのドキュメントも見つけることができないようです。Schematronで存在しない要素をテストする方法

<sch:rule context="/A/B/C[@TYPE='TEST1']" id="identifier-required"> 
    identifier must be present 
     <sch:assert test="not(.)" id="identifier-required"> 
    identifier-required: identifier must be present 
     </sch:assert> 
    </sch:rule> 

をそして次のドキュメントに対してそれを適用します:

は、次のルールを取る

<A> 
    <B> 
     <C TYPE="TEST2">TEST</C> 
     <C TYPE="TEST3">TEST</C> 
    </B> 
</A> 

は、理論的には、これは失敗しなければならない、しかし私はそれがないことがわかりました。これが正しい動作であれば誰でも知っていますか?

答えて

1

文脈が決して決して一致しないルールは決して発動せず、エラーを報告しません。存在するコンテキスト(たとえば "/")を持つルールを定義し、そのコンテキストで少なくとも1つのノードが式で選択されていることを確認する必要があります。A/B/C[@TYPE='TEST1']

2

確かにSchematronの要素。

アサーションはルールのコンテキストが一致しないため失敗しません。

ルールが一致する場合、必ず.が存在するため、<sch:assert test="not(.)">は決して通過しません。

あなたが代わりにCの親に代わり、あなたのコンテキストを設定し、その後、このようなCが子として存在していないと主張するかもしれません:

<sch:rule context="/A/B" id="identifier-required"> 
    <sch:assert test="not(C[@TYPE='TEST1'])" id="identifier-required"> 
     identifier-required: identifier must be present 
    </sch:assert> 
</sch:rule> 

しかし、あなたの診断メッセージは、あなたが実際にそのようなことを主張したいことを示唆していますCはので、おそらくあなたが本当に欲しいもの、存在している:

メッセージ、と自分の与えられたXMLで失敗し
<sch:rule context="/A/B" id="identifier-required"> 
    <sch:assert test="C[@TYPE='TEST1']" id="identifier-required"> 
     identifier-required: identifier must be present 
    </sch:assert> 
</sch:rule> 

「識別子-必要:識別子が存在しなければなりません」。

関連する問題