2016-08-16 6 views
0

Я создаю HTML-адрес электронной почты для кампании с использованием XML и XSLT. У меня почти есть то, что я хочу, но я получаю несколько повторяющихся материалов, и я не могу понять, как устранить дублирующие элементы.Создайте таблицу HTML с помощью XSLT 1.0

Есть одно дополнительное требование, которое я забыл добавить изначально: мне нужно добавить настраиваемые шаблоны для каждого элемента контента, чтобы применить другое форматирование на основе элемента. Кроме того, есть случайные изображения в содержании, которые должны быть смоделированы

Вот некоторые примеры XML:

<?xml version="1.0" encoding="UTF-8"?> 
<job> 
<surface> 
<preheader><preheader_p>Click for more information</preheader_p></preheader> 
<preheader><preheader_p>Questions? Call 877-555-1212</preheader_p></preheader> 
<preheader><preheader_p>Click to unsubscribe</preheader_p></preheader> 
<brand href="Images/logo.jpeg" /> 
<headline>Headline goes here</headline> 
<subhead>Subhead goes here</subhead> 
<body_copy>First paragraph goes here</body_copy> 
<body_copy>Second paragraph goes here</body_copy> 
<chart href="Images/graph.jpeg" /> 
<body_copy>Third paragraph goes here</body_copy> 
</surface> 
</job> 

Использование XSLT Мне нужно построить таблицу, которая вставляет содержимое Preheader в левой колонке таблица с двумя столбцами. В правой колонке мне нужно вставить логотип продукта.

После отображения содержимого заголовка и логотипа оставшийся контент вставляется последовательно, каждый в своей собственной строке таблицы.

Вот мой XSLT:

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:output method="html" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/> 

<xsl:template match="/"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 

<body> 
<table width="600" border="1"> 
<tr><td> 
<table width="100%" border="1"> 
    <tr> 
    <td width="60%"> 
     <table width="100%" border="1"> 
     <xsl:apply-templates select="job/surface/preheader" />   
     </table> 
    </td> 
    <td width="40%"><xsl:apply-templates select="job/surface/brand"/></td> 
    </tr> 
</table> 
</td></tr> 
<xsl:apply-templates select="job/surface" /> 
</table> 
</body> 
</html> 
</xsl:template> 

<xsl:template match="preheader"><tr><td style="font-size:11pt;"><xsl:value-of select="."/></td></tr> 
</xsl:template> 
<xsl:template match="brand"><img style="max-width:100%" src="{@href}" /> 
</xsl:template> 
<xsl:template match="headline"><tr><td style="font-size:20pt;"><xsl:value-of select="."/></td></tr> 
</xsl:template> 
<xsl:template match="subhead"><tr><td style="font-size:16pt;"><xsl:value-of select="."/></td></tr> 
</xsl:template> 
<xsl:template match="body_copy"><tr><td style="font-size:12pt;"><xsl:value-of select="."/></td></tr> 

</xsl:stylesheet> 

Проблема заключается в том, что Preheader и логотип элементы двойного повторения.

Цель состоит в том, чтобы создать следующий HTML:

<html> 
<body> 
<table width="600" border="1"> 
<tr><td> 
<table width="100%" border="1"> 
<tr><td width="60%"><table width="100%" border="1"> 
    <tr><td>Click for more information</td></tr> 
    <tr><td>Questions? Call 877-555-1212</td></tr> 
    <tr><td>Click to unsubscribe</td></tr> 
    </table></td> 
    <td width="40%"><img style="max-width:100%" src="Images/logo.jpeg"></td</tr> 
</table></td></tr> 
<tr><td style="font-size:20pt;">Headline goes here</td></tr> 
<tr><td style="font-size:16pt;">Subhead goes here</td></tr> 
<tr><td style="font-size:12pt;">First paragraph goes here</td></tr> 
<tr><td style="font-size:12pt;">Second paragraph goes here</td></tr> 
<tr><td><img style="max-width:100%" src="Images/graph.jpeg" /></td></tr> 
<tr><td style="font-size:12pt;">Third paragraph goes here</td></tr> 
</table> 
</body> 
</html> 

ответ

0

Это решение, которое прекрасно работает. Он сочетает исправление Майкла повторяющихся элементов и предусматривает применение шаблонов для форматирования отдельных элементов контента. Спасибо

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 
<xsl:output method="xml" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" indent="yes"/> 

<xsl:template match="/job/surface"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
<title>Untitled Document</title> 
</head> 

<body> 
<table width="600" border="0" align="center" style="font-family:Arial, Helvetica, sans-serif;"> 
<tr><td><table width="100%"><tr><td width="60%" valign="bottom"> 
<table width="100%"><tr><td style="padding: 0px 0px 5px 0px; font-size:10px;"><xsl:value-of select="preheader[1]"/></td></tr> 
<xsl:for-each select="preheader[position() > 1]"> 
<tr><td style="padding: 0px 0px 5px 0px; font-size:10px;"><xsl:value-of select="."/></td></tr></xsl:for-each> 
</table></td> 
<td width="40%"><xsl:apply-templates select="brand"/></td></tr></table></td></tr> 


<xsl:apply-templates select="headline | subhead | bullet_level_1 | bullet_level_2 | body_copy | footnote | chart | logo | generic_image"/>    


</table> 
</body> 
</html> 

</xsl:template> 

<!--Add templates below to style each element...--> 
<xsl:template match="headline"><tr><td class="headline full" valign="top" style=" font-size:150%; font-weight:bold; color:#444444; padding-bottom:5px; padding-top:14px;"><xsl:apply-templates /></td></tr></xsl:template> 

<xsl:template match="subhead"><tr><td class="subhead" style="padding: 5px 0px 0px 0px; color: rgb(181,26,138); font-size: 115%;"><xsl:apply-templates /></td></tr></xsl:template> 
... 
</xsl:stylesheet> 
0

Проблема заключается в том, что Preheader и логотип элементы повторяют дважды.

Причина, почему у вас есть эти повторяющиеся строки эта инструкция:

<xsl:apply-templates select="job/surface" /> 

Это эффективно применяет шаблоны для всех потомков surface - в том числе и preheaderbrand узлов вы уже обработаны.

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

<xsl:apply-templates select="job/surface/headline | job/surface/subhead | job/surface/body_copy" /> 

Кстати, интересно, если вы не могли бы сделать это просто:

XSLT-1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="http://www.w3.org/1999/xhtml"> 
<xsl:output method="xml" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" indent="yes"/> 

<xsl:template match="/job"> 
    <html> 
     <body> 
      <table border="1"> 
       <tr> 
        <td> 
         <xsl:value-of select="surface/preheader[1]"/> 
        </td> 
        <td rowspan="{count(surface/preheader)}"> 
         <img style="max-width:100%" src="{@href}" /> 
        </td> 
       </tr> 
       <xsl:for-each select="surface/preheader[position() > 1]"> 
        <tr> 
         <td> 
          <xsl:value-of select="."/> 
         </td> 
        </tr> 
       </xsl:for-each> 
       <xsl:for-each select="surface/headline | surface/subhead | surface/body_copy"> 
        <tr> 
         <td colspan="2"> 
          <xsl:value-of select="."/> 
         </td> 
        </tr> 
       </xsl:for-each> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

Обратите внимание, что ваше объявление пространства имен не наследуется элементами, которые вы создаете в других шаблонах. Вы можете видеть, что количество табличных строк в не-имен:

<tr xmlns=""> 

Вы должны переместить объявление пространства имен по умолчанию до stylesheet элемента, как показано в моем примере выше.

+0

Я не могу использовать атрибуты colspan или rowspan. Из-за характера клиентов электронной почты мы должны использовать вложенные таблицы, как в моем первоначальном примере. Я попытался пересмотреть решение, чтобы создать таблицу с двумя столбцами с вложенными элементами, но я не могу заставить ее правильно генерировать вложенность. –

+0

Боюсь, что вы потеряли меня в этот момент. Если вы не можете использовать colspan/rowspan, то игнорируйте мое предложение перезаписи. Не меняет выражение 'xsl: apply-templates'' select' решить проблему дублированных строк? –

+0

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

Смежные вопросы