我在我的项目中使用JODReports (http://jodreports.sourceforge.net/)来生成文档。问题出在'#if...‘中的'AND’逻辑运算上。指令。示例(在'.odt‘模板中):
[#if entry1?? AND entry2??]bla bla[/#if]如果'entry1‘和'entry2’存在,并且它们不是空值,这应该写为'bla bla‘,但在解析模板时,我得到错误:
freemarker.core.ParseException: Encountered "AND" at line 4, column 30424 in content.xml.
Was expecting one of:
">" ...
"." ...
"[" ...
"(" ...
"?" ...
"!" ...
<TERMINATING_EXCLAM> ...
"??" ...
"+" ...
"-" ...
"*" ...
"/" ...
"%" ...
"!=" ...
"=" ...
"==" ...
">=" ...
<ESCAPED_GTE> ...
">" ...
<ESCAPED_GT> ...
<LESS_THAN_EQUALS> ...
<LESS_THAN> ...
".." ...
<AND> ...
<OR> ...
at freemarker.core.FMParser.generateParseException(FMParser.java:4697)
at freemarker.core.FMParser.jj_consume_token(FMParser.java:4568)
at freemarker.core.FMParser.If(FMParser.java:1171)
at freemarker.core.FMParser.FreemarkerDirective(FMParser.java:2372)
at freemarker.core.FMParser.Content(FMParser.java:2618)
at freemarker.core.FMParser.OptionalBlock(FMParser.java:2786)
at freemarker.core.FMParser.List(FMParser.java:1257)
at freemarker.core.FMParser.FreemarkerDirective(FMParser.java:2375)
at freemarker.core.FMParser.Content(FMParser.java:2618)
at freemarker.core.FMParser.OptionalBlock(FMParser.java:2786)
at freemarker.core.FMParser.Escape(FMParser.java:2302)
at freemarker.core.FMParser.FreemarkerDirective(FMParser.java:2445)
at freemarker.core.FMParser.Content(FMParser.java:2618)
at freemarker.core.FMParser.OptionalBlock(FMParser.java:2786)
at freemarker.core.FMParser.Root(FMParser.java:2958)
at freemarker.template.Template.<init>(Template.java:149)
at freemarker.template.Template.<init>(Template.java:172)...这很奇怪,因为'AND‘在预期语句列表中。更改类似以下内容的模板:
[#if (entry1??) AND (entry2??)]bla bla[/#if]
[#if entry1?? <AND> entry2??]bla bla[/#if]
[#if (entry1??) <AND> (entry2??)]bla bla[/#if]
[#if (entry1)?? AND (entry2)??]bla bla[/#if]
[#if entry1?? [AND] entry2??]bla bla[/#if]
[#if (entry1??) [AND] (entry2??)]bla bla[/#if]也不起作用。使用'&&‘或'&’而不是'AND‘会导致错误:
freemarker.core.ParseException: Encountered ";" at line 4, column 30430 in content.xml.
Was expecting one of:
">" ...
"." ...
"[" ...
"(" ...
"?" ...
"!" ...
<TERMINATING_EXCLAM> ...
"??" ...
"+" ...
"-" ...
"*" ...
"/" ...
"%" ...
"!=" ...
"=" ...
"==" ...
">=" ...
<ESCAPED_GTE> ...
">" ...
<ESCAPED_GT> ...
<LESS_THAN_EQUALS> ...
<LESS_THAN> ...
".." ...
<AND> ...
<OR> ...
at freemarker.core.FMParser.generateParseException(FMParser.java:4697)
at freemarker.core.FMParser.jj_consume_token(FMParser.java:4568)
at freemarker.core.FMParser.If(FMParser.java:1171)
at freemarker.core.FMParser.FreemarkerDirective(FMParser.java:2372)
at freemarker.core.FMParser.Content(FMParser.java:2618)
at freemarker.core.FMParser.OptionalBlock(FMParser.java:2786)
at freemarker.core.FMParser.List(FMParser.java:1257)
at freemarker.core.FMParser.FreemarkerDirective(FMParser.java:2375)
at freemarker.core.FMParser.Content(FMParser.java:2618)
at freemarker.core.FMParser.OptionalBlock(FMParser.java:2786)
at freemarker.core.FMParser.Escape(FMParser.java:2302)...我当然可以写两个'#if‘指令--就像这样:[#if entry1??][#if entry2??]bla bla[/#if][/#if] --但我不想这么做。有什么建议吗?
谢谢,阿瑞克
发布于 2012-08-23 15:59:40
FreeMarker没有像and或AND这样的运算符,它只有&&。所以[#if entry1?? && entry2??]bla bla[/#if]应该可以工作。从您在这种情况下得到的错误消息中,我假设有什么东西(不是FreeMarker)从&&逃脱到了&&。这需要被阻止,那么它就会奏效。
由于错误消息指出AND是受支持的,这是一个原始的JavaCC错误消息,它只是说标识为<AND>的令牌是受支持的……如果有疑问,我推荐使用FreeMarker的文档:http://freemarker.org/docs/dgui_template_exp.html#dgui_template_exp_logicalop
发布于 2015-03-30 19:50:30
如果您查看JODReport JUnit测试
public void testDirectiveWithSpecialChars():
使用此ODT的:
存在相同的情况,并且此测试正在正确通过。
<text:p text:style-name="Standard">
<text:text-input text:description="jooscript">[#if (cond1=='pass' && cond2=='pass')]</text:text-input>
</text:p>
<text:p text:style-name="Standard">All passed!</text:p>
<text:p text:style-name="Standard">
<text:text-input text:description="jooscript">[#elseif (cond1=='pass' || cond2=='pass')]</text:text-input>
</text:p>
<text:p text:style-name="Standard">Partly passed!</text:p>
<text:p text:style-name="Standard">
<text:text-input text:description="jooscript">[#else]</text:text-input>
</text:p>
<text:p text:style-name="Standard">All failed!</text:p>
<text:p text:style-name="Standard">
<text:text-input text:description="jooscript">[/#if]</text:text-input>
</text:p>但是当你删除标签时:
<text:text-input text:description="jooscript"> </text:text-input>正如您所描述的,测试将失败。因此,目前的解决方案是使用标记来封装代码。
马丁
https://stackoverflow.com/questions/12086072
复制相似问题