我只是想知道是否可以将XPath表达式与Camel simple
表达式混合。
案例:
在我的configure()
路线方法中,我有代码:
Namespaces ns = new Namespaces("sys1", "urn:com:example:namespace:system/1");
directFrom("from")
.setExchangePattern(ExchangePattern.InOut)
.to("{{request.endpoint}}")
.choice()
.when(header(STATUS_CODE).isEqualTo(200))
.choice()
.when(xpath("count(//sys1:UsageType[@code='0003'])>0").namespaces(ns))
.setHeader(STATUS_CODE,constant(404))
.setHeader(STATUS_MESSAGE,simple("Not found"))
.setBody(constant("Not found"))
.endChoice()
.otherwise()
.to("xslt:xslt/response.xsl?transformerFactoryClass=net.sf.saxon.TransformerFactoryImpl")
.endChoice()
.end()
.endChoice()
.end();
我希望XPath表达式中的值是可配置的:是否可以在xpath表达式中使用这样的内容:
.when(xpath("count(//sys1:UsageType[@code='${properties:filter.value}'])>0").namespaces(ns)))
我使用与simple
表达式相同的语法。
我找到的唯一方法是在变量中注入(使用蓝图)整个XPath(或只是值)。
答案 0 :(得分:2)
// Following properties are given:
// foo=Camel
// bar=Kong
from("direct:in").choice()
// $type is a variable for the header with key type
// here we use the properties function to lookup foo from the properties files
// which at runtime will be evaluted to 'Camel'
.when().xpath("$type = function:properties('foo')")
.to("mock:camel")
// here we use the simple language to evaluate the expression
// which at runtime will be evaluated to 'Donkey Kong'
.when().xpath("//name = function:simple('Donkey ${properties:bar}')")
.to("mock:donkey")
.otherwise()
.to("mock:other")
.end();
因此,类似的东西应该有效:
.when(xpath("count(//sys1:UsageType[@code=function:simple('${properties:filter.value}')])>0").namespaces(ns))