You need to enable JavaScript to run this app. Thymeleaf处理XML模板时变量未被替换的问题求解
优惠活动
大模型
产品
解决方案
定价
更多

Thymeleaf处理XML模板时变量未被替换的问题求解

问题原因及解决方法

核心原因

Thymeleaf默认不会解析普通XML属性中的${}变量表达式,你需要显式标记需要动态渲染的内容,同时XML模板需要引入Thymeleaf命名空间才能识别th前缀的属性。

解决步骤

1. 补充XML模板命名空间

在模板的根标签上添加Thymeleaf命名空间声明:

<根标签名称 xmlns:th="http://www.thymeleaf.org">
<!-- 其余模板内容 -->
</根标签名称>

2. 修改变量绑定写法(二选一即可)

方案A:使用Thymeleaf属性绑定(推荐)

把需要动态赋值的属性用th前缀标记,两种写法可选:

  • 直接动态生成value属性:
<arc:set attr="CountryCode" th:value="${argument}"/>
  • 保留静态测试值,渲染时动态覆盖原有value:
<arc:set attr="CountryCode" value="测试默认值" th:attr="value=${argument}"/>

方案B:使用内联表达式

如果你想继续用[[]]包裹变量的写法,需要在根标签开启XML内联模式:

<根标签名称 xmlns:th="http://www.thymeleaf.org" th:inline="xml">
    <arc:set attr="CountryCode" value="[[${argument}]]"/>
</根标签名称>

3. Java代码可选优化

测试阶段关闭模板缓存,避免读取历史缓存的旧模板导致修改不生效;如果是无Spring环境的独立项目,可以改用ClassLoaderTemplateResolver避免初始化空Spring上下文:

SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
// 无Spring环境可替换为下面的代码
// ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
resolver.setApplicationContext(new AnnotationConfigApplicationContext());
resolver.setPrefix("templates/");
resolver.setSuffix(".xml");
resolver.setCharacterEncoding("UTF-8");
resolver.setTemplateMode(TemplateMode.XML);
resolver.setCacheable(false); // 测试环境关闭模板缓存

SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(resolver);

Context ctx = new Context();
ctx.setVariable("argument", "fr");
String xml = engine.process("Checker", ctx);

验证效果

修改完成后渲染得到的xml内容中,对应标签会输出为:

<arc:set attr="CountryCode" value="fr"/>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 15:36:00