2015-01-11 2 views
3

Это, очевидно, SSCCE.StringTemplate indentation добавляет пробел внутри строки

У меня есть следующий файл шаблона:

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-файл, даже при обрезке пробелов, значение 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, как есть (без отступов в случае появления новых строк внутри), и в то же время сохранить пробелы/отступы для всех других случаев (так что мой сделанный вывод не будет уродливым)?

Update

Я попытался с помощью NoIndentWriter но был встречен with other problems. Таким образом, кажется, что NoIndentWriter действительно испускает многострочную строку, как она есть, но делает не честь пробела присутствует в файле шаблона. Поэтому я вернулся на первый план.

+0

Включил ли содержимое в '' раздел изменить результат? – dasblinkenlight

+0

@dasblinkenlight Я не уверен, что понимаю, что вы предлагаете. Во всяком случае, если CDATA добавлен в шаблон, то ничего не меняется относительно вставки пробелов во время отступов многострочной строки. Кроме того, я не уверен, что добавление раздела CDATA в мой заключительный документ не содержит побочных эффектов. –

+0

Я думал о '', надеясь, что stringtemplate обратит внимание на разделы 'CDATA'. Похоже, что нет. Ну хорошо ... – dasblinkenlight

ответ

0

Так что в конце концов я сделал, чтобы использовать NoIndentWriter с кодом in this post. Затем, чтобы решить проблему отсутствия отступов, которая приводит к уродливому XML (жалуется на вышеупомянутый пост), я использовал описанный XML-принтер here.