这显然是一个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
确实确实发出了多行字符串,但不尊重模板文件中存在的空格。所以我回到了第一方。