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 漂亮打印机。

于 2015-01-20T20:18:52.367 回答