如何编辑 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 值。