WSO2 ESB中使用fn:concat拼接单引号失败的解决方案咨询
在WSO2 ESB中拼接单引号的可行方案
我之前在WSO2 ESB里处理字符串拼接时也踩过这个单引号的坑!直接在XPath表达式里用单引号会因为语法冲突失败,下面给你几个经过验证的解决办法:
方法1:XPath单引号转义
XPath规定,在单引号包裹的字符串里,要表示一个单引号需要用两个单引号转义。同时确保你的expression属性用双引号包裹,这样转义才能生效:
<property expression="get-property('uri.var.id')" name="aId" scope="default" type="STRING"/> <property expression="fn:concat(get-property('aId'), '''')" name="accId" scope="default" type="STRING"/>
这里的'''其实是:外层两个单引号包裹字符串,中间两个单引号转义成一个实际的单引号,最终会把aId的值和一个单引号拼接起来。
方法2:预先定义单引号属性
这种方式更直观,避免转义的混乱,适合复杂拼接场景:
<!-- 先定义一个存单引号的属性 --> <property name="singleQuote" value="'" scope="default" type="STRING"/> <property expression="get-property('uri.var.id')" name="aId" scope="default" type="STRING"/> <!-- 直接引用这个属性进行拼接 --> <property expression="fn:concat(get-property('aId'), get-property('singleQuote'))" name="accId" scope="default" type="STRING"/>
方法3:使用XPath的fn:char()函数
单引号的ASCII码是39,用fn:char(39)可以直接生成单引号字符,不需要处理转义:
<property expression="get-property('uri.var.id')" name="aId" scope="default" type="STRING"/> <property expression="fn:concat(get-property('aId'), fn:char(39))" name="accId" scope="default" type="STRING"/>
为什么你之前的方法失效?
- 用
'的话,XML解析器会先把它转换成单引号,但XPath表达式在解析时可能因为嵌套语法问题导致冲突,所以这种方式在ESB的property表达式里不太可靠。 - 如果直接用ASCII数值而不是
fn:char()函数,XPath会把它当作数字而非字符处理,自然拼接不出单引号。
你可以根据自己的场景选其中一种,我个人更推荐方法2或3,可读性更高也不容易出错。
内容的提问来源于stack exchange,提问作者nad.SN
相关产品推荐
相关产品推荐

