在模板中定义变量

典型模板使用的大多数变量都来自数据模型。但是模板也可以自己定义变量,通常用来保存循环变量,临时结果,宏等。从模板修改数据模型是设计不支持的。请注意,每个模板处理作业都有自己的这些变量的私有集,当模板处理作业完成时,这些变量将被丢弃。

您访问模板中定义的变量的方式与访问数据模型根目录中定义的变量的方式相同。例如,如果您在模板中创建一个名为“ foo”的变量,则可以使用${foo}打印其值。巧合的是,如果在数据模型中也有一个名为“ foo”的变量,那么在模板中创建的变量将隐藏(而不是覆盖!)它。

模板中定义了以下几种变量:

  • “普通”变量 :可以从模板中的任何位置或通过include directive插入的其他模板访问它们。您可以使用assign指令创建或替换这些变量,或者,由于宏和函数仅仅是变量,因此可以使用macro directivesfunction directives来创建和替换这些变量。

  • 局部变量 :只能在宏定义主体功能定义主体内部设置它们,并且只能从那里看到,而不能从其他宏或从那里调用的函数中看到。局部变量仅在宏或函数调用期间存在。您可以使用local directive在定义体内创建和替换局部变量。 Macrofunction参数也是局部变量。

  • 循环变量 :循环变量是由诸如list的指令(如<#list xs as x>...</#list>中的x)自动创建的,它们仅存在于指令的开始标记和结束标记之间。 (用户定义的指令,例如宏,也可以创建循环变量.)它们仅在这些标签之间直接可见,而不能从宏或从那里调用的函数中看到。因此,它们与局部变量非常相似,但不能直接分配给它们。

  • 全局变量 :不应使用这些变量。全局变量由所有模板共享,即使它们由于import-ing而属于不同的名称空间也是如此。因此,它们的可见性类似于数据模型变量。它们是通过global directive设置的。全局变量隐藏(但不覆盖)同名的数据模型变量。

示例:使用assign创建和替换变量:

<#assign x = 1>  <#-- create variable x -->
${x}
<#assign x = 2> <#-- replace variable x -->
${x}
<#assign x++> <#-- replace variable x -->
${x}
1
2
3

在下一个示例中,我们演示了局部变量隐藏(不覆盖)相同名称的“ plain”变量,并且循环变量隐藏(不覆盖)具有相同名称的局部变量和“ plain”变量:

<#assign x = "plain">
1. ${x}  <#-- we see the plain var. here -->
<@test/>
6. ${x}  <#-- the value of plain var. was not changed -->
<#list ["loop"] as x>
    7. ${x}  <#-- now the loop var. hides the plain var. -->
    <#assign x = "plain2"> <#-- replaces the plain var, not the loop var. -->
    8. ${x}  <#-- it still hides the plain var. -->
</#list>
9. ${x}  <#-- now the new value of plain var. becomse visible -->

<#macro test>
  2. ${x}  <#-- we still see the plain var. here -->
  <#local x = "local">
  3. ${x}  <#-- now the local var. hides it -->
  <#list ["loop"] as x>
    4. ${x}  <#-- now the loop var. hides the local var. -->
  </#list>
  5. ${x}  <#-- now we see the local var. again -->
</#macro>
1. plain
  2. plain
  3. local
    4. loop
  5. local
6. plain
    7. loop
    8. loop
9. plain2

在下一个示例中,我们演示一个内部循环变量可以隐藏(而不是覆盖)同名的外部循环变量:

<#list ["loop 1"] as x>
  ${x}
  <#list ["loop 2"] as x>
    ${x}
    <#list ["loop 3"] as x>
      ${x}
    </#list>
    ${x}
  </#list>
  ${x}
</#list>
loop 1
    loop 2
      loop 3
    loop 2
  loop 1

当变量在数据模型中隐藏该变量时,您仍然可以使用special variable globals从数据模型中读取该变量。例如,假设我们在数据模型中有一个名为user的变量,其值为“ Big Joe”:

${user}          <#-- prints: Big Joe -->
<#assign user = "Joe Hider">
${user}          <#-- prints: Joe Hider -->
${.globals.user} <#-- prints: Big Joe -->

您也可以 Rewrite.data_model.user,然后甚至<#global user = "...">也无法在数据模型中隐藏该值。但是,通常故意将全局变量设置为覆盖来自数据模型的值,因此通常使用globals是更好的做法。

有关变量语法(允许的字符等)的信息,请阅读:The Template/Expressions