13.3. 转义 无效的 VTL 指令

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

## #include( "a.txt" ) renders as <contents of a.txt>
#include( "a.txt" )

## /#include( "a.txt" ) renders as /#include( "a.txt" )
/#include( "a.txt" )

## //#include ( "a.txt" ) renders as /<contents of a.txt>
//#include ( "a.txt" )

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

#if( $jazz )
    Vyacheslav Ganelin
#end

如果 $jazz为 true,输出是

Vyacheslav Ganelin

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

/#if( $jazz )
    Vyacheslav Ganelin
/#end

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

#if($ jazz )
     Vyacheslav Ganelin
 #end

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

//#if( $jazz )
   Vyacheslav Ganelin
//#end

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

/ Vyacheslav Ganelin
/

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

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

///#if( $jazz )
    Vyacheslave Ganelin
//#end

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