如何编辑 XPath 选择器以处理多个记录
将 TypedXmlDocument 断言到引擎中时,将创建单独的子 TypedXmlDocument;请参阅 断言。 引擎将根据规则中定义的 XPath 选择器决定创建哪些子 TypedXmlDocument。 在编辑器中生成规则时,XPath 选择器的值默认为事实浏览器的“XML 架构”选项卡中所选节点之上的那个节点。 相对于所选节点的父节点,XPath 字段的值默认为所选节点本身。
在某些情况下,您可能希望自定义编辑器在生成规则时创建的默认 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>
假设您希望生成计算每个 Orderline 的 Total 值的规则。 该规则应与下面所列相似:
IF 1==1
THEN /Order/Orderline/Total = (/Order/Orderline/Hat/Cost + /Order/Orderline/Shirt/Cost)
XPath 的粗体部分表示选择器部分,其余部分表示字段 XPath。 这些都是编辑器生成的默认值。 但是,运行此策略将导致创建 6 个对象:2 个 Orderline 对象、2 个 Hat 对象和 2 个 Shirt 对象。 Orderline 总计值将针对 Hat 对象和 Shirt 对象的每个组合来进行计算,并始终设置为同一值,该值源自上次执行规则所得的结果。 该规则将触发 8 次。 然而,这并不是本方案的预期结果。
一种解决方案是按如下所示编辑 XPath 值:
IF 1==1
THEN /Order/Orderline/Total = (/Order/Orderline/Hat/Cost + /Order/Orderline/Shirt/Cost)
所有三个字段的选择器 XPath 值均已设置为同一 /Order/Orderline 值,并且字段 XPath 值也已进行相应的编辑。 这是通过在“XML 架构”选项卡中选择节点时更改属性窗口中的 XPath 选择器和 XPath 字段值来完成的。应在将字段拖动到规则参数之前执行此操作。
如果执行包含此更改的策略,则会根据每个 Orderline 内 Shirt 节点和 Hat 节点的 Cost 值正确计算出该 Orderline 的 Total 值。