Я намереваюсь реализовать паттерн Мартина Фаулера
для рендеринга 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, как бы я проанализировал содержимое ценника?