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

如何在FreeMarker中根据日期打印XML列表中的指定价格

解决FreeMarker从XML列表按日期key取价格的问题

首先我先根据你的描述推测下XML的大致结构(应该是类似这样的key-value节点结构):

99.85301833 100.xxxx

下面给你几种可行的写法,你可以根据实际的XML解析情况选择:

1. 直接过滤匹配指定日期(最便捷)

如果allProductPrices下是一堆带key属性的节点,用FreeMarker的?filter过滤器就能快速定位目标价格:

<!-- 获取2017-03-31对应的价格 -->
${reportData.allProductPrices.entry?filter(x -> x.@key == "2017-03-31")?first}

这里的@key是用来访问XML节点的属性,?filter负责筛选出符合日期条件的节点,?first取筛选后的第一个节点(毕竟日期key应该是唯一的),它的文本内容就是你要的价格。

2. 循环遍历+条件判断(适合遍历或容错场景)

如果你需要遍历所有日期,或者担心指定的日期不存在会导致页面报错,可以用列表循环结合条件判断:

<#list reportData.allProductPrices.entry as priceItem>
  <#if priceItem.@key == "2017-03-31">
    日期2017-03-31的价格:${priceItem}
  </#if>
</#list>

3. 当成Map直接访问(如果框架已解析成Map)

有些XML解析框架会把这种key-value结构的节点直接解析成FreeMarker的Map对象,这种情况下就更简单了,直接用键值对的方式访问:

${reportData.allProductPrices["2017-03-31"]}

(因为日期里包含横杠,用方括号访问比点语法更稳妥)

额外容错提示

如果担心指定的日期可能不存在,记得加上默认值避免页面报错:

<!-- 过滤方式的默认值 -->
${reportData.allProductPrices.entry?filter(x -> x.@key == "2017-03-31")?first!"无对应价格"}

<!-- Map方式的默认值 -->
${reportData.allProductPrices["2017-03-31"]!"无对应价格"}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:01:43