You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:24:54