Camel XSLT组件动态XML转换:能否在URI中传入Java变量作为模板?
关于Camel XSLT组件传入字符串模板的问题
兄弟,直接用xslt:${fee}这种写法是行不通的哈~原因很简单:Camel的XSLT组件默认是通过URI来定位静态资源路径的(比如classpath下的.xsl文件、本地文件系统路径),它没法直接识别URI里传入的字符串形式的XSLT模板内容。
那要实现动态传入字符串类型的XSLT模板,该怎么操作呢?给你两种常用的方案:
方案一:直接使用StringSource包装模板字符串
如果你已经拿到了fee这个字符串类型的模板变量,可以通过transform().xslt()方法,用StringSource把模板包装后传入,代码示例如下:
import javax.xml.transform.stream.StringSource; // ... from("direct:foo") .transform().xslt(new StringSource(fee)) .to("direct:output");
StringSource是JDK自带的XML转换源类,专门用来处理字符串形式的XML/XSLT内容。
方案二:动态从Exchange中获取模板字符串
如果模板字符串是存放在Exchange的Header或者其他属性里的(比如你示例里的fee是消息头),可以用Lambda表达式动态获取并包装:
from("direct:foo") .transform().xslt(exchange -> { // 从Header中获取字符串模板 String xsltTemplate = exchange.getIn().getHeader("fee", String.class); return new StringSource(xsltTemplate); }) .to("direct:output");
额外注意点
- 要确保你的字符串模板是合法的XSLT语法,否则转换时会抛出语法错误
- 如果模板内容比较大或者需要复用,更建议把模板存成独立的.xsl文件,通过资源路径(比如
xslt:classpath:templates/my-transform.xsl)引用,这样性能和维护性更好 - 如果你用的是Spring Boot + Camel,也可以结合Camel的表达式语言(比如Simple表达式)来动态获取模板,但核心还是要通过
StringSource来包装字符串内容
内容的提问来源于stack exchange,提问作者swadipti panigrahi
相关产品推荐
相关产品推荐

