簡體   English   中英

JOD報告帶有'and'指令異常的freemarker'if'

[英]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沒有像andAND運算符,只有&& 所以[#if entry1?? && entry2??]bla bla[/#if] [#if entry1?? && entry2??]bla bla[/#if]應該起作用。 從這種情況下收到的錯誤消息中,我認為某些東西(不是FreeMarker)已經逃脫了&&&amp;&amp; 需要防止這種情況,然后它將起作用。

截至錯誤消息,指出支持AND ,這是原始的JavaCC錯誤消息,它只是說支持標識為<AND>的令牌...如有疑問,我建議使用FreeMarker的文檔: http:// freemarker。組織/文檔/ dgui_template_exp.html#dgui_template_exp_logicalop

如果您對JUnitReport進行JODReport測試

公共無效testDirectiveWithSpecialChars():

https://github.com/hernad/jodreports/blob/master/jodreports/src/test/java/net/sf/jooreports/templates/TextInputTagTest.java

使用此ODT:

https://github.com/hernad/jodreports/blob/master/jodreports/src/test/resources/textinput-directives-special-chars-template.odt

情況相同,此測試正確通過。

        <text:p text:style-name="Standard">
            <text:text-input text:description="jooscript">[#if (cond1==&apos;pass&apos; &amp;&amp; cond2==&apos;pass&apos;)]</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==&apos;pass&apos; || cond2==&apos;pass&apos;)]</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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM