3

これは明らかにSSCCEです。

次のテンプレート ファイルがあります。

xml(value)::=<<
<a>
    <b>
        ^value^
    </b>
</a>
>>

...次のコードで:

private static final String VALUE="alpha\nbeta";
public static void main(String args[]) throws Exception {
    STGroup stGroup = new STGroupFile("templates/a.xml.stg", '^', '^');
    ST st = stGroup.getInstanceOf("xml");
    st.add("value", VALUE);
    System.out.printf("--------\n%s\n--------", st.render());
}

コードは以下を生成します。

 [java] --------
 [java] <a>
 [java]     <b>
 [java]         alpha
 [java]         beta
 [java]     </b>
 [java] </a>
 [java] --------

つまり、空白が追加されると文字列値が変更されます。クライアントが XML ファイルを解析すると、空白がトリミングされていても、文字列内に空白が追加されているため、文字列値が変更されたものとして認識されます。

テンプレートを次のように宣言することが解決策であることを理解しています。

xml(value)::=<<
<a>
    <b>^value^</b>
</a>
>>

...しかし、このソリューションでも、xmlレンダリングを含む可能性のある他のすべてのノードも右揃えにする必要があります。

たとえば、上記のレンダリングされた値が別のテンプレートに埋め込まれていると仮定すると、次のテンプレート:

enclosing-document(xml)::=<<
<h1>
    <h2>
        ^xml^
    </h2>
</h1>
>>

... また、次のように書き直す必要があります。

enclosing-document(xml)::=<<
<h1>
    <h2>
^xml^
    </h2>
</h1>
>>

...実際には、すべてのノードを左揃えにする必要があります。

StringTemplate に特定の String パラメーターをそのまま出力するように指示する方法はありますか (新しい行が存在する場合はインデントせずに)、同時に他のすべての場合に空白/インデントを保持します (私のレンダリングされた出力が醜い)?

アップデート

NoIndentWriterを使用してみましたが、別の問題が発生しました。そのため、NoIndentWriter実際には複数行の文字列をそのまま出力しますが、テンプレート ファイルに存在する空白を尊重しないようです。だから私は振り出しに戻っています。

4

1 に答える 1

0

したがって、最終的に私がしたことは、この投稿で指定されたコードでNoIndentWriterを使用することでした。次に、見苦しい XML になるインデントの欠如 (前述の投稿で不満を述べた) を解決するために、ここで説明されている XML pretty-printer を使用しました。

于 2015-01-20T20:18:52.367 に答える