13.3. 转义 无效的 VTL 指令

VTL 可以通过反斜杠("/")来进行转义,directives can be escaped with the backslash character in a manner similar to valid VTL references.

  1. ## #include( "a.txt" ) renders as <contents of a.txt>
  2. #include( "a.txt" )
  3. ## /#include( "a.txt" ) renders as /#include( "a.txt" )
  4. /#include( "a.txt" )
  5. ## //#include ( "a.txt" ) renders as /<contents of a.txt>
  6. //#include ( "a.txt" )

在转义在一个单一指令内包含多个脚本元素(比如f-else-end语句)的指令时应多加小心。下面是一个典型的VTL if语句;

  1. #if( $jazz )
  2. Vyacheslav Ganelin
  3. #end

如果 $jazz为 true,输出是

  1. Vyacheslav Ganelin

如果 $jazz 为false,将没有输出。转义脚本元素将改变输出。考虑下面的情况;

  1. /#if( $jazz )
  2. Vyacheslav Ganelin
  3. /#end

不管 $jazz 是真或假,输出都是

  1. #if($ jazz )
  2. Vyacheslav Ganelin
  3. #end

事实上,因为所有脚本元素都被转义了, $jazz 永远不会被求值。将设反斜杠在被合法转义的脚本元素之前

  1. //#if( $jazz )
  2. Vyacheslav Ganelin
  3. //#end

这时,如果$jazz 为真,输出是

  1. / Vyacheslav Ganelin
  2. /

为理解这个情况,请注意在一个新行结束是将在输出中忽略新的一行。因此,经过#if()前的'//' 加工后,#if()块紧跟第一个'/'。最后一个/位于新的一行,因为在'Ganelin'后又一个新行,所以,最后的那个位于#end 之前的//是语句块的一部分。

如果 $jazz 为false,这里将没有输出。注意,在开始破坏了if语句的情况将不能被正确转义:

  1. ///#if( $jazz )
  2. Vyacheslave Ganelin
  3. //#end

这里,#if 被转义,但有一个#end 被保留了;所以有多个结束语句将导致解析错误。