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

Apache Camel中XSLT设置omit-xml-declaration不生效问题

解决Camel调用XSLT后仍保留XML声明的问题

我来帮你分析下这个问题,可能有几个原因导致即使你在XSLT里设置了omit-xml-declaration="yes",转换后还是出现XML声明:

1. XSLT缺少命名空间声明,导致XPath匹配失败

你的XSLT里使用了s:和o:前缀(比如s:Envelope、o:Response),但没有在<xsl:stylesheet>标签中定义对应的命名空间。这会导致XPath无法正确匹配到目标节点,最终可能输出的是整个SOAP消息(而不是o:Result里的内容),而原始SOAP消息本身可能带有XML声明。

修正方案:

补充命名空间声明,替换成你实际使用的SOAP和目标服务的命名空间:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"  <!-- SOAP信封的标准命名空间 -->
    xmlns:o="http://your-service-namespace/">          <!-- 替换为Response/Result所在的实际命名空间 -->

    <xsl:output omit-xml-declaration="yes" />

    <xsl:template match="/">
        <xsl:value-of select="/s:Envelope/s:Body/o:Response/o:Result" disable-output-escaping="yes" />
    </xsl:template>
</xsl:stylesheet>

2. o:Result节点的文本内容本身带有XML声明

如果o:Result里存储的是一段带有<?xml version="1.0"?>声明的完整XML文本,那么disable-output-escaping="yes"会把这段文本原样输出,包括其中的声明。这种情况下,XSLT的omit-xml-declaration只控制XSLT转换输出的顶层声明,无法处理节点内部文本里的声明。

修正方案:

如果是这种情况,你需要先移除o:Result文本内容里的XML声明。可以在XSLT里使用字符串替换来处理:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:o="http://your-service-namespace/">

    <xsl:output omit-xml-declaration="yes" />

    <xsl:template match="/">
        <!-- 移除文本开头的XML声明 -->
        <xsl:variable name="resultText" select="/s:Envelope/s:Body/o:Response/o:Result" />
        <xsl:value-of select="substring-after($resultText, '&lt;?xml version=&quot;1.0&quot;?&gt;')" 
                      disable-output-escaping="yes" />
    </xsl:template>
</xsl:stylesheet>

注意:如果声明的版本或编码不同,需要调整substring-after里的匹配字符串。

3. Camel XSLT组件的默认配置覆盖了XSLT的设置

极少数情况下,Camel的XSLT组件可能会强制添加XML声明。你可以在路由的to URI中显式指定outputXmlDeclaration=false参数来覆盖:

<to uri="xslt:classpath:///schema/xml_response_extractor.xslt?outputXmlDeclaration=false" />

建议先从第一个原因排查,补充命名空间是最常见的问题——前缀没有绑定命名空间的话,XPath根本找不到目标节点,自然无法输出你期望的内容。

内容的提问来源于stack exchange,提问作者keanu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:46:27