Apache Camel XSLT组件如何使用带xsl:import依赖的样式表转换XML
问题核心根因
Apache Camel 3.9.0 版本的xslt组件默认资源解析逻辑,没有将主样式表的物理存储目录作为xsl:import相对路径的解析基准,默认仅从类路径根目录、JVM进程启动的工作目录两个位置查找被导入的样式表资源,因此哪怕主样式表能被正常加载,所有依赖的外部xsl文件都会因为路径基准不匹配出现加载失败,最终触发全局变量未定义的报错。
可落地的配置解决方法
- 自定义URIResolver绑定主样式表路径基准(适配文件系统部署场景)
xslt端点支持通过resourceResolver参数注入自定义的URIResolver实现,替换Camel默认的资源查找逻辑。自定义实现的核心逻辑为:每次解析xsl:import的相对路径时,自动拼接主样式表所在的物理绝对路径作为基准目录,匹配完成后再读取对应文件。
路由中的端点配置示例:
其中from("file:./inboundXml") .to("xslt:file:D:/xslt/main/main.xsl?resourceResolver=#customXsltUriResolver")customXsltUriResolver是注册在容器中的自定义解析器Bean,不需要修改原有xsl文件里的任何import路径写法。 - 类路径下对齐原有目录结构(适配Jar包部署场景)
将所有存在导入依赖的xsl文件,按照原有的层级关系完整放入项目resources目录,保证类路径下的相对目录结构和xsl:import中写的路径完全一致(比如main.xsl放在resources/xslt/main/,上级依赖的base.xsl放在resources/xslt/,子目录的componetA/xyz.xsl、componetB/abc.xsl完全保持原层级)。
端点直接用类路径引用主样式表即可:.to("xslt:xslt/main/main.xsl"),Camel默认的类路径解析器会顺着类路径的目录结构自动匹配所有被导入的资源,不需要额外自定义逻辑。 - 预加载样式表资源绕过默认查找逻辑
自定义实例化xslt组件使用的TransformerFactory,提前将所有被import的xsl文件编译为Templates对象,和对应的资源URI做映射缓存。主样式表加载过程中遇到import请求时,直接从本地缓存中匹配对应的编译结果,不会再触发文件系统查找逻辑,彻底避免路径解析失败的问题。注意3.9.0版本不支持高版本才提供的uriResolverFactory内置参数,直接使用会导致配置不生效。
你之前尝试过的调整斜杠格式、配置file协议、加xml:base属性、将依赖文件复制到同目录等操作,本质都是在调整相对路径本身,没有修改路径解析的基准逻辑,因此始终无法匹配到正确的资源位置,这类调整在默认解析逻辑下是无法生效的。
内容的提问来源于stack exchange,提问作者Zeussi
相关产品推荐
相关产品推荐

