我正在使用Camel并尝试根据xml文件设置一些标头。问题是我需要设置2个标题,这些标题组合成xml中的单个属性,并用冒号':'分隔。
这是xml行:
<Alarm AlarmID="CC4567:180" DeviceID="CC0000:10.254.0.146" TimeStamp="2016-01-31 18:51:29.488">
我需要将AlarmID的两个部分分开。我知道我可以使用以下内容:
<camel:setHeader headerName="firstPart">
<xpath resultType="java.lang.String">substring(/ticket/alarmId,1,6)</xpath>
</camel:setHeader>
但问题在于第一部分实际上并不限于6个字符。我尝试了以下但是我收到了一个错误:
substring(/ticket/alarmId, 1, indexOf(':')-1)
错误:
camel.builder.xml.InvalidXPathExpression:无效的xpath:substring(/ ticket / alarmId,indexOf(':'))。原因:javax.xml.xpath.XPathExpressionException:net.sf.saxon.trans.XPathException:未知的系统函数indexOf()
所以我的问题是有另一种方法可以做到这一点,因为似乎camel不支持indexOf()。目标是我可以有2个标题,firstPart = CC4567和secondPart = 180
答案 0 :(得分:1)
看起来你正在使用撒克逊和它不支持它不包含一个名为indexOf的函数。您需要使用有效的xPath函数来获取您想要的内容。尝试在xPath 2.0中使用tokenize()函数,该函数允许您将字符串拆分为“:”。
答案 1 :(得分:0)
看起来IndexOf不是一个已定义的函数,而是substring-before()和substring-after()
,这对我的情况非常有用:
<camel:setHeader headerName="firstPart">
<xpath resultType="java.lang.String">substring-before(/ticket/alarmId, ':')</xpath>
</camel:setHeader>
<camel:setHeader headerName="secondPart">
<xpath resultType="java.lang.String">substring-after(/ticket/alarmId, ':')</xpath>
</camel:setHeader>
对于Tokenizer,这也可以在另一个答案中提出,使用它看起来像这样:
<camel:setHeader headerName="firstPart">
<xpath resultType="java.lang.String">tokenize(/ticket/alarmId,':')[1]</xpath>
</camel:setHeader>
<camel:setHeader headerName="secondPart">
<xpath resultType="java.lang.String">tokenize(/ticket/alarmId,':')[2]</xpath>
</camel:setHeader>
我选择了以前的选项,因为我认为它具有更好的可读性