これは明らかに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
実際には複数行の文字列をそのまま出力しますが、テンプレート ファイルに存在する空白を尊重しないようです。だから私は振り出しに戻っています。