【问题标题】:What is the recommended approach to use Mule choice router with XSLT将 Mule 选择路由器与 XSLT 一起使用的推荐方法是什么
【发布时间】:2013-01-29 23:49:23
【问题描述】:

我在我的 Mule 3.3 流程中使用下面显示的choice 元素的 sn-p。 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 转换器返回此有效负载 &lt;?xml version="1.0" encoding="UTF-8"?&gt;ABC

我的问题是如何比较返回的String。我不认为payload.contains() 是最好的方法,尽管它解决了我的目的,而且我们不会返回匹配的实体,就像ABCxy 一样,但这仍然不是一个完整的证明解决方案。

【问题讨论】:

    标签: xslt mule


    【解决方案1】:

    在您的 xslt 中添加 omit-xml-declaration 部分,如下所示。这将为您提供没有序言的原始字符串。

    <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')]">
    

    这样它应该可以工作。

    【讨论】:

    • @Learner。请让我知道该解决方案是否适合您。
    • 您对omit-xml-declaration 属性的指针帮助我摆脱了序言。谢谢您的回答。虽然我最终使用了#[message.payload == 'ABC'] 而不是#[message.payload.contains('ABC')],因为这是一个更准确的评估。 contains 更像是一个 substring 函数。
    • 很高兴您得到了解决方案。我把它作为包含,因为我认为你在条件表达式中寻找子字符串函数。
    【解决方案2】:

    也许这就是你要找的东西:

    <when evaluator="xpath" expression="/result/" ...
    

    显然,您的 XSLT 将需要返回一个格式良好的 XML 文档,并在 XPath 可轻松访问的 XML 元素中返回所需的结果。

    【讨论】:

    • 可以使用XSL TransformerXPath 不提供我在这里需要的编程能力。感谢您的关注
    • 哦,我明白你在说什么。您的意思是编辑 XSLT 以返回 XML 而不是 String,然后使用 XPath。这不是矫枉过正吗?
    • 并非如此。 XSLT 的输出通常是 XML,通过使用 XPath,您将从正确的结构中获得所需的确切元素。如果您需要进一步扩展它,它将很容易扩展。但是,我不确定返回类型是保持 String 还是其他类型 - 需要尝试一下。
    • 来自 Mule In Action 2ed,XSL 转换器在源和返回类型方面用途广泛。该转换器还根据输入类型(或 returnClass 属性,如果已设置)推断出最佳匹配的返回类型。
    【解决方案3】:

    在 Mule 网站上,他们建议使用 expression-splitter-router evaluator,这是 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>
    

    希望有帮助

    【讨论】:

    • 这是一个很好的例子,但在我的情况下不起作用,因为从 XSLT 返回的对象将始终是字符串,我的意图不是拆分有效负载,而是根据有效负载内容将其推送到特定队列。
    • 仅供参考,在 Mule 3 中,services 已被 flows 取代。
    • 我同意大卫的观点,但我从 mule 3.3 用户指南mulesoft.org/documentation/display/MULE3USER/Using+Expressions 中取出的示例。他们应该更新他们的文件:)
    猜你喜欢
    • 1970-01-01
    • 2014-11-05
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2013-01-11
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多