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 被保留了;所以有多个结束语句将导致解析错误。