在Camel中混合xpath和简单表达式

时间:2014-08-04 09:11:40

标签: xpath apache-camel

我只是想知道是否可以将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(或只是值)。

1 个答案:

答案 0 :(得分:2)

来自Camel documentation

// 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))