2

我正在使用 XPath 在骆驼中实现基于内容的路由器。但是由于某种原因,XPath 表达式不会评估内容,并且总是选择其他路径。这是我在骆驼上下文中定义的路线:

<route>
        <from uri="cxf:bean:hioServiceEndPoint"/>
        <process ref="hioProcessor"/>
        <inOnly uri="file:{{path.ws.data}}/incoming/hio?fileName=hio_${date:now:yyyyMMdd_HHmmssSS}.xml"/>
        <choice>
            <when>
                <xpath>//ORDER_TYPE = 'CROSSDOCKING'</xpath>
                <log message="NIELS Incoming CROSS HIO !!!"/>
                <to uri="jms:incomingHioCross"/>
            </when>
            <otherwise>
                <to uri="jms:incomingHio"/>
                <log message="NIELS Incoming HIO"/>
            </otherwise>
        </choice>
        <transform>
            <constant>OK</constant>
        </transform>
</route>

这是需要搜索标签的 XML ORDER_TYPE

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<INBOUND_ORDER xmlns="urn:ifsworld-com:schemas:handle_inbound_order">
    <DELIVERY_LEADTIME>0.0</DELIVERY_LEADTIME>
    <DELNOTE_DATE>2010-12-15T00:00:00</DELNOTE_DATE>
    <DELNOTE_NO>1454</DELNOTE_NO>
    <DESPATCH_DATE>2010-12-15T16:39:43</DESPATCH_DATE>
    <ORDER_DATE>2010-12-15T16:39:43</ORDER_DATE>
    <ORDER_NO>1454</ORDER_NO>
    <ORDER_TYPE>CROSSDOCKING</ORDER_TYPE>
    <REMARKS xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
    <SITE>DC2</SITE>
    <VENDOR_NO>ALM</VENDOR_NO>
    <INBOUND_ORDER_LINES>
        <INBOUND_ORDER_LINE>
            <CURRENCY_CODE>EUR</CURRENCY_CODE>
            <PART_NO>1276.1</PART_NO>
            <QUANTITY>2.0</QUANTITY>
            <QUANTITY_UNIT_MEAS>PCS</QUANTITY_UNIT_MEAS>
            <REMARKS xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
            <SEQUENCE_NO>1.0</SEQUENCE_NO>
            <UNIT_PRICE>0.0</UNIT_PRICE>
        </INBOUND_ORDER_LINE>
    </INBOUND_ORDER_LINES>
</INBOUND_ORDER>

我看不出我做错了什么,我也尝试过/INBOUND_ORDER/ORDER_TYPE = 'CROSSDOCKING',但即便如此,我似乎也可以让它工作。我编写了一个测试用例来查看我的 XPath 表达式是否正确,并且工作正常并返回 true。

我正在使用骆驼 2.5.0。

因此,如果有人有小费,我将不胜感激。

4

1 回答 1

1

我对你的命名空间有点困惑xmlns="urn:ifsworld-com:schemas:handle_inbound_order"。它是一个有效的命名空间吗?

无论如何,我认为这应该有效:

//*[local-name() = 'ORDER_TYPE'][codepoint-equal(text(), 'CROSSDOCKING')]
于 2012-09-05T09:33:43.717 回答