通过Camel中xpath中字符的索引获取子字符串

时间:2016-04-22 18:59:21

标签: xml xpath apache-camel saxon

我正在使用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

2 个答案:

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

我选择了以前的选项,因为我认为它具有更好的可读性