0

私は次のチェックを持っています

<iso:pattern id="myChecks">
  <iso:rule context="/root/outerElement/innerElement">
    <iso:assert test="typeElement[@someAttribute='type1']">
      No typeElement with someAttribute=type1 found
    </iso:assert>  
    <iso:assert test=".[child::typeElement[@someAttribute='value1']]/data">
      No dataElement found in an innerElement with typeElement with someAttribute=type1
    </iso:assert>
    <iso:assert test="count(typeElement[@someAttribute='type1'] > 1)">
      There is more than 1 innerElement with typeElement 1 with someAttribute=type1
    </iso:assert>
  </iso:rule>
</iso:pattern>

ドキュメントは次のようになります。

<outerElement>
  <!-- 1 of the dataElements is mandatory -->
  <!-- and i need exact one innerElement which has a typeElement with someAttribute=type1 -->
  <innerElement>
    <dataElement>data</dataElement>
    <dataElement>data</dataElement>
    <typeElement someAttribute="type1"></typeElement>    
  </innerElement>

  <!-- This is not allowed and check 3 should find this -->
  <innerElement>
    <dataElement>data</dataElement>
    <dataElement>data</dataElement>
    <typeElement someAttribute="type1"></typeElement>    
  </innerElement>

  <!-- This one is valid because type2 has other restrictions -->
  <innerElement>
    <typeElement someAttribute="type2"></typeElement>    
  </innerElement>
</outerElement>

問題は、チェック 1 と 2 がすべての innerElement をチェックしてエラーを生成することです。これは、タイプ 2 が 3 回ある場合、最初の 3 つのチェックでそれぞれ 3 つのエラーが発生することを意味します。私が望むのは、正確に1つのinnerElementにtype1があり、これに少なくとも1つのdataElementがあることを確認し、type2のinnerElementにdataElementが強制されないようにすることです。

3 番目のチェックはまったく機能していません。複数の innerElement があるたびにエラーがスローされるようです。

誰かがこれで私を助けてくれますか?

4

1 に答える 1

1

ここでの問題は、各 innerElement が独自のコンテキストであるため、個別に処理されることです。これに対する解決策は、コンテキストから innerElement を削除し、それを assert フィールドに入れることです。

于 2012-08-10T15:20:20.783 に答える