Apache Camel路由内嵌入XSLT文件用于XSLT端点的方法咨询
在Apache Camel路由内嵌XSLT的正确姿势
嘿,我来帮你搞定这个Apache Camel里内嵌XSLT的问题!你之前在JavaScript脚本块里写XSLT代码报错是很正常的——JS脚本块是用来执行JavaScript逻辑的,根本不能直接放XSLT,所以才会抛出那个ScriptEvaluationException。下面给你几种可行的实现方式,包括你提到的Header/Body传递的方法:
方法1:直接在路由中内嵌XSLT(推荐,Camel 3.11+支持)
如果你的Camel版本是3.11及以上,可以直接在xslt组件里内嵌XSLT代码,不用额外依赖外部文件或者Header/Body传递。
XML DSL示例
<route> <from uri="direct:processXml"/> <xslt> <text><![CDATA[ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <transformed-data> <xsl:value-of select="root/input-field"/> </transformed-data> </xsl:template> </xsl:stylesheet> ]]></text> </xslt> <to uri="direct:outputResult"/> </route>
Java DSL示例
from("direct:processXml") .xslt(new StringReader(""" <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <transformed-data> <xsl:value-of select="root/input-field"/> </transformed-data> </xsl:template> </xsl:stylesheet> """)) .to("direct:outputResult");
方法2:通过Header传递XSLT代码
如果你的Camel版本较低,或者需要动态切换XSLT内容,可以把XSLT代码放到Message Header里,然后让xslt组件读取这个Header的内容。
XML DSL示例
<route> <from uri="direct:processXml"/> <!-- 把XSLT代码存入Header --> <setHeader name="CustomXslt"> <simple><![CDATA[ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <output> <xsl:value-of select="data/value"/> </output> </xsl:template> </xsl:stylesheet> ]]></simple> </setHeader> <!-- 指定xslt组件使用Header中的XSLT --> <xslt headerName="CustomXslt"/> <to uri="direct:outputResult"/> </route>
Java DSL示例
from("direct:processXml") .setHeader("CustomXslt", constant(""" <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <output> <xsl:value-of select="data/value"/> </output> </xsl:template> </xsl:stylesheet> """)) .xslt().headerName("CustomXslt") .to("direct:outputResult");
方法3:通过Body传递XSLT代码(需注意原始数据保存)
这种方式需要先把要转换的原始XML数据保存到Header,再把XSLT代码放到Body,最后让xslt组件读取Body里的XSLT,并使用Header中的原始数据作为输入。
XML DSL示例
<route> <from uri="direct:processXml"/> <!-- 保存原始XML数据到Header --> <setHeader name="OriginalXml"> <simple>${body}</simple> </setHeader> <!-- 设置Body为XSLT代码 --> <setBody> <simple><![CDATA[ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <result> <xsl:value-of select="source/data"/> </result> </xsl:template> </xsl:stylesheet> ]]></simple> </setBody> <!-- 使用Body中的XSLT处理Header里的原始XML --> <xslt resource="body:" inputHeader="OriginalXml"/> <to uri="direct:outputResult"/> </route>
一些注意事项
- 确保你的XSLT代码格式正确,必须包含
xsl:stylesheet根节点和正确的命名空间xmlns:xsl="http://www.w3.org/1999/XSL/Transform"。 - 如果XSLT逻辑比较复杂,内嵌代码可能会导致路由文件臃肿,不如维护外部XSL文件方便,这点可以根据实际场景选择。
- 低版本Camel(3.11以下)不支持直接内嵌XSLT,建议用Header传递的方式。
内容的提问来源于stack exchange,提问作者Lucifer
相关产品推荐
相关产品推荐

