[英]JODReports freemarker 'if' with 'and' directive exception
我在项目中使用JODReports(http://jodreports.sourceforge.net/)来生成文档。 问题在于“ [#if ...]”指令中的“与”逻辑运算。 示例(在“ .odt”模板中):
[#if entry1?? AND entry2??]bla bla[/#if]
如果存在'entry1'和'entry2'并且它们不为null,则应该写'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]
-但我不知道想要这样做。 有什么建议么?
谢谢,Arek
FreeMarker没有像and
或AND
运算符,只有&&
。 所以[#if entry1?? && entry2??]bla bla[/#if]
[#if entry1?? && entry2??]bla bla[/#if]
应该起作用。 从这种情况下收到的错误消息中,我认为某些东西(不是FreeMarker)已经逃脱了&&
到&&
。 需要防止这种情况,然后它将起作用。
截至错误消息,指出支持AND
,这是原始的JavaCC错误消息,它只是说支持标识为<AND>
的令牌...如有疑问,我建议使用FreeMarker的文档: http:// freemarker。组织/文档/ dgui_template_exp.html#dgui_template_exp_logicalop
如果您对JUnitReport进行JODReport测试
公共无效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>
如您所描述的,测试将失败。 因此,目前的解决方案是使用该标记来封装您的代码。
马丁
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.