2012-01-05 7 views
1

У меня есть шаблон XSL, который представляет собой небольшую часть HTML-письма. Раздел XSL изменяется на основе данных, но окружающий HTML его нет. Я хотел бы включить этот HTML-код в шаблон XSL. Я попробовал следующий подход, но получаю исключение, потому что теги в EmailHeader.html не закрыты. Я пробовал использовать теги CDATA, но без успеха.Как включить HTML-разделы в шаблон XSL?

Мое исключение: Неожиданный конец файла произошел. Следующие элементы не закрыты: td, tr, table, td, tr, table, body, html.

Как включить разделы html в шаблон XSL?

(образцы кода были упрощены)

Мой XSL Файл:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html" /> 

    <xsl:template match="/Email">  

    <xsl:copy-of select="document('EmailHeader.html')"></xsl:copy-of> 

    <table border="0" cellpadding="0" cellspacing="0"> 
     <tr> 
     <td style="width:25px">&#160;</td> 
     <td style="width:550px; text-align:left; font-family:Arial; font-size:10pt; color:#444444"> 
      <br /><br /> 
      To <xsl:value-of select="FirstName"/>&#160;<xsl:value-of select="LastName"/>: 
      <br /><br /> 
      Welcome, and thank you for enrolling... 
     </td> 
     <td style="width:25px">&#160;</td> 
     </tr> 
    </table> 

    <xsl:copy-of select="document('EmailFooter.html')"></xsl:copy-of> 

    </xsl:template> 

</xsl:transform> 

EmailHeader.html:

<html xmlns="http://www.w3.org/1999/xhtml" style="background-color:#96A084"> 
<head> 
    <title></title> 
</head> 
<body style="background-color:#96A084; margin:0px; padding:0px"> 
<table border="0" cellpadding="0" cellspacing="0" width="630px" style="background-color:#96A084"> 
    <tr> 
    <td> 

EmailFooter.html:

<td style="width:15px">&#160;</td> 
    </tr> 
</table> 
</body> 
</html> 
+0

Почему вы не можете буквально вставить эти элементы html в документ? –

+0

Я могу, но я хочу, чтобы они были разделены так, что если/когда они меняются, мне не нужно редактировать каждый XSL-файл, который у меня есть (может быть сотни). Верхний и нижний колонтитулы поддерживают внешний вид электронной почты, а XSL - это только динамический текст, который заполняет его. Имеют смысл? – ExceptionEx

+0

как обменить его? Другими словами, используйте свой верхний/нижний колонтитул в одном XSL-файле и импортируйте содержимое. Это должно держать все хорошо сформированным ... – deanoj

ответ

4

Что вы можете сделать, это создать ваш полный шаблон электронной почты в отдельном файле, а затем передать тело сообщения электронной почты в качестве параметра. Например, сохраните следующую XSLT в файле EmailTemplate.xslt

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html"/> 

    <xsl:template name="Email"> 
     <xsl:param name="body"/> 
     <html xmlns="http://www.w3.org/1999/xhtml" style="background-color:#96A084"> 
     <head> 
      <title/> 
     </head> 
     <body style="background-color:#96A084; margin:0px; padding:0px"> 
      <table border="0" cellpadding="0" cellspacing="0" width="630px" style="background-color:#96A084"> 
       <tr> 
        <td> 
        <xsl:copy-of select="$body"/> 
        </td> 
        <td style="width:15px"> </td> 
       </tr> 
      </table> 
     </body> 
     </html> 
    </xsl:template> 
</xsl:transform> 

Далее изменить исходный XSLT импортировать этот файл, а затем вызвать по имени по электронной почте шаблона с HTML для тела электронной почты в качестве параметра

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:include href="EmailTemplate.xslt"/> 

    <xsl:output method="html"/> 

    <xsl:template match="/Email"> 
     <xsl:variable name="body"> 
     <table border="0" cellpadding="0" cellspacing="0"> 
      <tr> 
       <td style="width:25px"> </td> 
       <td style="width:550px; text-align:left; font-family:Arial; font-size:10pt; color:#444444"> 
        <br/> 
        <br/> To 
        <xsl:value-of select="FirstName"/> 
        <xsl:value-of select="LastName"/>: 
        <br/> 
        <br/>Welcome, and thank you for enrolling... 
       </td> 
       <td style="width:25px"> </td> 
      </tr> 
     </table> 
     </xsl:variable> 
     <xsl:call-template name="Email"> 
     <xsl:with-param name="body" select="$body"/> 
     </xsl:call-template> 
    </xsl:template> 

</xsl:transform> 

Итак, когда вы применить этот XSLT к следующему XML

<Email> 
<FirstName>John</FirstName> 
<LastName>Smith</LastName> 
</Email> 

Должно быть выведено следующее:

<html style="background-color:#96A084" xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title></title> 
</head> 
<body style="background-color:#96A084; margin:0px; padding:0px"> 
<table border="0" cellpadding="0" cellspacing="0" width="630px" style="background-color:#96A084"> 
<tr> 
<td> 
<table border="0" cellpadding="0" cellspacing="0" xmlns=""><tr><td style="width:25px"> </td><td style="width:550px; text-align:left; font-family:Arial; font-size:10pt; color:#444444"><br><br> To 
        John 
        Smith: 
        <br><br>Welcome, and thank you for enrolling... 
       </td><td style="width:25px"> </td></tr></table> 
</td> 
<td style="width:15px"> </td> 
</tr> 
</table> 
</body> 
</html> 
+0

2 года спустя, но это было замечательно для моего проекта –