Mule ESB:如何使用Xpath在Datamapper中进行条件检查

时间:2014-09-16 23:41:38

标签: mule mule-studio mule-component

我在xpath中遇到问题 - 我需要检查两个属性值,如果条件满足需要做硬代码我自己的值。下面是我的xml。

我需要像子根内部一样​​检查条件 - 如果ItemType = Table1和ItemCondition = Chair1那么我必须给出一个硬编码值'Proceed'(这个硬编码值我将映射到datamapper的目标端)。

  <Root>
  <SubRoot>
      <ItemType>Table1</ItemType>
      <ItemCondition>Chair1</ItemCondition>
      <ItemValue>
          .......
       </ItemValue>
  </SubRoot>
  <SubRoot>
      <ItemType>Table2</ItemType>
       <ItemCondition>chair2</ItemCondition>
       <ItemValue>
           .......
       </ItemValue>
   </SubRoot>

       ....Will have multiple subroot
   </Root>

我试图定义如下规则,但是它会抛出错误

  Type: String
  Context:/Root
  Xpath:    substring("Proceed", 1 div boolean(/SubRoot[ItemType="Table1" and ItemCondition="Chair1"]))

但它会像

那样抛出错误
  net.sf.saxon.trans.XPathException: Arithmetic operator is not defined for arguments of types (xs:integer, xs:boolean)

还有其他快捷方式可以执行此操作。请你帮助我,我付出了很多努力。无法解决它。提前谢谢。

2 个答案:

答案 0 :(得分:1)

我不确定你在哪里应用这个,但你正在寻找的XPath表达式是:

fn:contains(/Root/SubRoot[2]/ItemCondition, "chair") and fn:contains(/Root/SubRoot[2]/ItemType, "Table")

所以这是一个例子,根据需要返回“继续”或“停止”:

if (fn:contains(/Root/SubRoot[1]/ItemCondition, "Chair") and fn:contains(/Root/SubRoot[2]/ItemType, "Table")) then 'Proceed' else 'Stop'

答案 1 :(得分:0)

为了实现上述条件,我最初厌倦了在xpath中做,给了我很多错误。我已经通过数据映射器的脚本部分中的简单if else条件实现了

 if ( (input.ItemType == 'Table') and (input.ItemCondition == 'chair')) { 

    output.Item = 'Proceed'}
    else  { 

    output.Item = 'Stop '};
  1. 确保您的优先顺序。示例,此处在xml结构(或已转换的POJO)中,必须先检查ItemType,然后再使用ItemCondition进行检查。
  2. &安培;&安培;似乎没有为我工作,改为&#39;和&#39;操作
  3. 如果您是第一次尝试实施逻辑。它可能对你有帮助。