【问题标题】:Freemarker variable definition referencing another variable引用另一个变量的 Freemarker 变量定义
【发布时间】:2011-11-14 02:20:30
【问题描述】:

我正在使用 Freemarker (FMPP) 自定义文本文件。我想要一个定义插值数据的属性文件,如下所示:

VAR1=some-value
VAR2=${VAR1}

这与我的实际文件高度简化,但保留了我用例的精髓。该模板包含${VAR2} 形式的引用,我希望它会导致some-value 被插值。相反,插值是文字${VAR1}

请注意,这与Can a freemarker interpolation contain an interpolation? 不同,后者指的是使用变量的值作为变量的名称(间接引用)。此外,can freemarker do second replacement 的解决方案涉及修改模板。我希望替换在概念上“在”处理模板之前发生,因此模板只能引用 ${VAR2} 而不需要注意双重插值。

有没有办法在 FreeMarker 中实现这一点?

如果没有,谁能告诉我 Velocity 是否可以轻松做到这一点?

【问题讨论】:

    标签: interpolation freemarker


    【解决方案1】:

    您在.properties 文件中引用的变量是否总是来自同一个.properties 文件?如果是这样,那么您可以编写一个自定义 FMPP DataLoader 来完成您需要的所有替换,就在文件加载时。 (或者,tdd 数据加载器也可以使用get(varname) 和一些eval(...)-s 实现类似的功能,但这对于此目的来说可能过于冗长。)

    在模板语言级别解决这个问题时,需要将 ${...} 的输出重新解释为模板片段,然后我也假设它不存在,直到输出中没有任何内容这看起来像一个模板语言结构。我不知道有什么模板语言可以做到这一点。但是,如果需要此操作的字符串使用自定义 TemplateScalarModel 实现包装,该实现在读取字符串的值时执行此重复评估,则它可以在 FreeMarker 中解决。 (要在 FMPP 中使用这种自定义的TemplateModel,您还需要一个自定义的 FMPP 数据加载器,它会在将字符串返回给 FMPP 之前以这种特殊方式包装字符串。)

    【讨论】:

    • 我就是这么想的,我也得出了同样的结论。我制定了一个两步解决方案,首先将属性变量作为模板处理(以替换外部参数),然后作为“真实”模板上的第二个转换的输入。
    猜你喜欢
    • 2021-09-28
    • 2015-05-24
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多