在XSLT中使用Mule选择路由器的推荐方法是什么?

时间:2013-01-29 15:31:30

标签: xslt mule

我在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类似的匹配实体,但这仍然不是一个完整的证明溶液

3 个答案:

答案 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>

希望有所帮助