Я намерен реализовать шаблон двухшагового просмотра Мартина Фаулера для рендеринга HTML в веб-приложении. Я пишу. Общая идея заключается в том, что приложение не выводит необработанный HTML, а выводит пользовательский промежуточный XML, который затем преобразуется в HTML/CSS. Это имеет ряд преимуществ, включая уменьшение дублирования кода и более согласованный вывод.
Подход, предложенный Фаулером для преобразования XML в окончательный HTML, заключается в использовании XSLT.
Я использовал XSLT раньше и знаю основы. Однако мне интересно, каковы преимущества использования XSLT. Альтернативный подход, который я рассматриваю, выглядит следующим образом:
Вот пример XML-вывода первого шага рендеринга:
<grid>
<headingRow>
<cell>Product</cell>
<cell>Price</cell>
</headingRow>
<row>
<cell>A product</cell>
<cell type="price">$54.95</cell>
</row>
</grid>
И желаемый окончательный вывод HTML:
<table class="grid">
<tr>
<th>Product</th>
<th>Price</th>
</tr>
<tr>
<td>A product</td>
<td>
<span class="currency_symbol">$</span>
<span class="decimal_number">54.95</span>
</td>
</tr>
</table>
Подход, который я рассматриваю, будет иметь один объект для каждого тега.
class GridTag extends Tag {
...
public void render() {
System.out.println("<table class=\"grid\">");
foreach(Tag child: children) {
child.render();
}
System.out.println("</table>");
}
...
}
Объекты будут построены в виде дерева путем анализа XML. Метод render() будет вызываться на корневом узле. Мне особенно нравится этот подход, потому что он позволяет мне делать классные вещи. В частности, если у меня есть тег ячейки, как указано выше, с атрибутом type="price":
<cell type="price">$54.95</price>
Связанный с ним класс Tag может анализировать содержимое тега, чтобы разделить символ валюты и числовое значение на отдельные теги HTML, чтобы обеспечить выравнивание символа валюты и десятичной точки, как в HTML-выводе выше.
<td>
<span class="currency_symbol">$</span>
<span class="decimal_number">54.95</span>
</td>
Вопросы:
Должен ли я делать это или использовать XSLT? Какие преимущества использования XSLT я могу упустить? Если бы мне пришлось использовать XSLT, как бы я разобрал содержимое ценника?