Как избежать повторения в шаблонах XSL - PullRequest
0 голосов
/ 04 января 2019

Я играл с XML + XSL как инструментом для генерации электронных писем в формате HTML.Поскольку код электронной почты так сильно зависит от устаревшей разметки и встроенных стилей, я подумал, что было бы неплохо извлечь фактический контент из всего сумасшествия, необходимого для его форматирования.

Но по мере продвижения вперед и создания большегошаблоны, я обнаруживаю, что повторяюсь все больше и больше.Есть ли способ высушить таблицы стилей XSL, или мне придется засорять мои XML-файлы элементами представления?Давайте возьмем этот фрагмент XML в качестве примера:

<root>
  <headline>Hello</headline>
  <button>Click me</button>
</root>

И заголовок, и кнопка нуждаются в некотором html вокруг них (например, H1 и div), но поскольку мы говорим оэлектронная почта, им также нужны ячейка таблицы, строка таблицы и таблица, например:

<table>
  <tr>
    <td>
      <h1>Hello</h1>
    </td>
  </tr>
</table>

<table>
  <tr>
    <td>
      <div>Hello</div>
    </td>
  </tr>
</table>

Таким образом, наивное решение состоит в том, чтобы включить эту разметку таблицы в таблицу стилей каждого элемента, например:

<xsl:template match="headline">
  <table>
    <tr>
      <td>
        <h1>
          <xsl:apply-templates/>
        </h1>
      </td>
    </tr>
  </table>
</xsl:template>

Но скажем, что во время тестирования я обнаружил ошибку в Outlook 2007, которая означает, что всем этим таблицам-оберткам требуется дополнительный атрибут: cell-padding=0;.Если я жестко закодировал разметку таблицы, мне, возможно, придется воспользоваться десятками шаблонов, чтобы распространить это исправление.

Есть ли способ создать «частичный» шаблон таблицы-оболочки и ссылаться на них вотдельные шаблоны для заголовка и кнопки?

Я знаю, что могу просто поменять разметку, чтобы она выглядела так:

<root>
  <table>
    <headline>Hello</headline>
  </table>
  <table>
    <button>Click me</button>
  </table>
</root>

Но это похоже на то, как пнуть банку в будущем.Что если я узнаю, что из-за ошибки в мобильном приложении Gmail все td нуждаются в собственном объявлении стиля?Тогда решение состоит в том, чтобы пойти и изменить разметку так, чтобы она была неотличима от конечного результата, и в этот момент, что на самом деле делают шаблоны XSL?

Я пробовал решение с call-template, ноне получил нигдеЛюбой совет будет оценен!

1 Ответ

0 голосов
/ 04 января 2019

Например, вы можете объединить ваши table шаблоны, как это

<xsl:template match="headline|button">
    <table cell-padding="0">
      <tr>
        <td>
          <xsl:apply-templates />
        </td>
      </tr>
    </table> 
</xsl:template>

<xsl:template match="text()[ancestor::headline]">
    <h1>
      <xsl:copy-of select="." />
    </h1>
</xsl:template>

<xsl:template match="text()[ancestor::button]">
    <div>
      <xsl:copy-of select="." />
    </div>
</xsl:template>

. Это объединит два ваших примера шаблона в один и разделит их позже на два разных пути.Я также добавил обработку Outlook 2007 .

Вывод вышеуказанных шаблонов

<table cell-padding="0">
    <tr>
        <td>
            <h1>Hello</h1>
        </td>
    </tr>
</table>
<table cell-padding="0">
    <tr>
        <td>
            <div>Click me</div>
        </td>
    </tr>
</table>
...