2


プロジェクトで JODReports (http://jodreports.sourceforge.net/) を使用してドキュメントを生成しています。問題は、'[#if...]' ディレクティブの 'AND' 論理演算にあります。例 (「.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]' ディレクティブを 2 つ書くこともできますが[#if entry1??][#if entry2??]bla bla[/#if][/#if]、それはしたくありません。助言がありますか?
ありがとう、アレック

4

2 に答える 2

3

FreeMarker にはandorのような演算子はなくAND、 のみがあり&&ます。だから[#if entry1?? && entry2??]bla bla[/#if]うまくいくはずです。その場合に表示されるエラーメッセージから、何か(FreeMarkerではない)が to をエスケープしたと思い&&ます&amp;&amp;。それを防ぐ必要があり、そうすればうまくいくでしょう。

サポートされていることを示すエラーメッセージの時点で、これはAND生のJavaCCエラーメッセージであり、<AND>サポートされていると識別されたトークンを示しているだけです...疑わしい場合は、FreeMarkerのドキュメントを使用することをお勧めします: http://freemarker.org/docs/ dgui_template_exp.html#dgui_template_exp_logicalop

于 2012-08-23T07:59:39.663 に答える