StringTemplate缩进在String中添加空格

时间:2015-01-11 17:26:31

标签: java stringtemplate stringtemplate-4

这显然是一个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] --------

换句话说,在添加空格时修改String值。当客户端解析XML文件时,即使使用空格修剪,String值也会被视为已更改,因为在内部字符串中添加了空格。

我知道解决方案是将模板声明为:

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,但遇到了with other problems。所以看起来NoIndentWriter确实会发出多行字符串,但是会尊重模板文件中存在的空格。所以我回到了原点。

1 个答案:

答案 0 :(得分:0)

所以最后我做的是使用NoIndentWriterin this post给出的代码。然后,为了解决缺少导致丑陋XML的缩进(在前面提到的帖子中抱怨),我使用了描述here的XML漂亮打印机。