TypedXmlDocument がエンジンにアサートされると、個別の子 TypedXmlDocument が作成されます。 Assert を参照してください。 エンジンは、ルールで定義されている XPath セレクターに基づいて、作成する TypedXmlDocuments の子を決定します。 Composer でルールを作成すると、XPath セレクターの値は、ファクト エクスプローラーの [XML スキーマ] タブで選択したノードの上のノードに既定で設定されます。 XPath フィールドの値は、既定で選択したノード自体に設定され、親ノードを基準にしています。
場合によっては、ルールを構築するときに Composer によって作成される既定の XPath をカスタマイズすることが必要になる場合があります。 次のサンプル XML ドキュメントを想定しています。
<Order>
<Orderline>
<Hat style="Baseball">
<Cost>10</Cost>
</Hat>
<Shirt color="Black">
<Cost>20</Cost>
</Shirt>
<Total></Total>
</Orderline>
<Orderline>
<Hat style="Bowler">
<Cost>20</Cost>
</Hat>
<Shirt color="Red">
<Cost>20</Cost>
</Shirt>
<Total></Total>
</Orderline>
</Order>
各注文ラインの合計値を計算するルールを作成するとします。 ルールは次のようになります。
IF 1==1
THEN /Order/Orderline/合計 = (/Order/Orderline/Hat/コスト + /Order/Orderline/Shirt/コスト)
XPath の太字部分はセレクター部分を示し、残りは Field XPath を表します。 これらは Composer によってビルドされた既定値です。 ただし、このポリシーを実行すると、6 つのオブジェクト (2 つの Orderline オブジェクト、2 つの Hat オブジェクト、2 つの Shirt オブジェクト) が作成されます。 Orderline の合計は、Hat オブジェクトと Shirt オブジェクトの組み合わせごとに計算され、合計は常に同じ値に設定されます。これは、ルールの最後の実行に起因します。 ルールは 8 回起動します。 これは、このシナリオでは意図したものではありません。
1 つの解決策は、XPath の値を次のように編集することです。
IF 1==1
THEN /Order/Orderline/Total = (/Order/Orderline/Hat/Cost + /Order/Orderline/Shirt/Cost)
3 つのフィールドすべてに対するセレクター XPath 値が同じ /Order/Orderline 値に設定され、それに応じて Field XPath の値が編集されています。 これを行うには、[XML スキーマ] タブでノードを選択したときに、[プロパティ] ウィンドウで XPath セレクターと XPath フィールドの値を変更します。これは、フィールドをルール引数にドラッグする前に行う必要があります。
この変更でポリシーを実行すると、その Orderline 内の [シャツ] ノードと [ハット] ノードのコスト値に基づいて、各注文ラインの合計値が正しく計算されます。