ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 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 被保留了;所以有多个结束语句将导致解析错误。