我在Mule 3.3流程中使用了以下显示的choice
元素片段。 XSL Transformer
为选择元素提供信息。 XSL Transformer应该返回String
(实体名称),并根据字符串值,使用选择路由器将其推送到不同的jms队列。
<flow name="ProcessOrder">
.
.
<xm:xslt-transformer xsl-file="xsl/getEntity.xslt" returnClass="java.lang.String"/>
<choice>
<when expression="payload.contains('ABC')">
<jms:outbound-endpoint queue="order.queue1" />
</when>
<when>
</when>
<otherwise>
</otherwise>
</choice>
</flow>
XSL Transformer返回此有效负载
<?xml version="1.0" encoding="UTF-8"?>ABC
我的问题是如何比较返回的String
。我不认为payload.contains()
是最好的方法,虽然它解决了我的目的,而且我们也不会返回与ABCxy
类似的匹配实体,但这仍然不是一个完整的证明溶液
答案 0 :(得分:1)
在xslt中添加omit-xml-declaration部分,如下所示。这将为您提供没有prolog的原始字符串。
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:template match="/">
...
...
这将给出
"ABC" as output instead of "<?xml version="1.0" encoding="UTF-8"?>ABC"
然后在表达式中使用它
<when expression="#[message.payload.contains('ABC')]">
这种方式应该可行。
答案 1 :(得分:0)
也许这就是你要找的东西:
<when evaluator="xpath" expression="/result/" ...
显然,您的XSLT需要在XPath可以轻松访问的XML元素中返回格式良好的XML文档,其中包含所需的结果。
答案 2 :(得分:0)
在Mule网站上,他们建议使用expression-splitter-router
评估者这是mule网站上如何使用它的一个例子:
FruitBowl含有苹果,橙子和两个香蕉。当Mule收到此对象时,我们希望将水果路由到不同的位置:AppleService,BananaService和OrangeService。
<service name="Distributor">
<inbound>
<jms:inbound-endpoint queue="distributor.queue"/>
</inbound>
<outbound>
<!-- FruitBowl.getFruit() List -->
<expression-splitter-router evaluator="bean" expression="fruit">
<vm:outbound-endpoint path="apple.service.queue">
<payload-type-filter expectedType="org.mule.tck.testmodels.fruit.Apple"/>
</vm:outbound-endpoint>
<vm:outbound-endpoint path="banana.service.queue">
<payload-type-filter expectedType="org.mule.tck.testmodels.fruit.Banana"/>
</vm:outbound-endpoint>
<vm:outbound-endpoint path="orange.service.queue">
<payload-type-filter expectedType="org.mule.tck.testmodels.fruit.Orange"/>
</vm:outbound-endpoint>
</expression-splitter-router>
</outbound>
</service>
希望有所帮助