2011-09-09 71 views
0

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

VAR1=some-value 
VAR2=${VAR1} 

这是非常从我的实际文件简化,但保留了我的用例的本质。该模板包含形式为${VAR2}的参考,我期望导致some-value被内插。相反,内插值是文字${VAR1}

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

有没有办法在FreeMarker中做到这一点?

如果不是,有人可以告诉我Velocity是否会轻松做到这一点?

回答

2

您在.properties文件中引用的变量是否始终来自相同的.properties文件?如果是这样,那么你可以写一个自定义的FMPP DataLoader,它可以在你加载文件的时候完成你需要的所有替换。 (或者,tdd数据加载器还可以实现利用get(varname)也许有些eval(...) -s类似的东西,但是这可能为了这个目的太冗长。)

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

+0

这就是我的想法,我已经来了相同的结论。我研究了两步解决方案,首先将属性变量作为模板处理(替换外部参数),然后将其作为“真实”模板上第二次转换的输入。 –

相关问题