65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 XSLT 和 XSLTArgumentList 进行电子邮件模板

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.85/5 (9投票s)

2005年2月16日

1分钟阅读

viewsIcon

106019

downloadIcon

1613

在XSLT转换中使用自定义.NET对象。

Sample Image

引言

本文使用XSLT文件作为模板文件来存储电子邮件模板。它专门针对在XSLT文件中使用自定义对象属性。

背景

除了C#和ASP.NET之外,还需要具备XML、XPath和XSLT的基本知识。

使用代码

为了尽可能地通用,EmailProject中的Email.cs类可以分解为其他各种组件。此外,User.csAccount.cs类文件可以放置在一个单独的项目中,该项目包含应用程序的业务对象。

以下是从email.cs文件中的摘录

public static void SetUserDetails()
{
  User myuser = new User();
  myuser.UserName = "ABC";
  myuser.EmailAddress = abc@someemail.com;
  Account myaccount = new Account();
  myaccount.AccountName = "ABC Account";
  Hashtable objHash = new Hashtable();
  objHash["ext:User"] = myuser;
  objHash["ext:Account"] = myaccount;
  SendEmail("xyz@email.com", "emailtemplate.xslt", objHash);
}

SetUserDetails()函数设置UserAccount对象的值。这些对象被发送用作XSLT文件的参数。因此,它们被添加到HashTable对象中,键名与XSLT文件中各自的xmlns命名空间标识符相同,如下所示。

<?xml version="1.0" encoding="UTF-8" ?>
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:UserDetails="ext:User"
     xmlns:Account="ext:Account">
XslTransform objxslt = new XslTransform();
objxslt.Load(templatepath + xslttemplatename);
XmlDocument xmldoc = new XmlDocument();
xmldoc.AppendChild(xmldoc.CreateElement("DocumentRoot"));
XPathNavigator xpathnav = xmldoc.CreateNavigator();
XsltArgumentList xslarg = new XsltArgumentList();
if (objDictionary != null)
  foreach (DictionaryEntry entry in objDictionary )
  {
    xslarg.AddExtensionObject(entry.Key.ToString(), entry.Value);
  }
  StringBuilder emailbuilder = new StringBuilder();
  XmlTextWriter xmlwriter = new 
    XmlTextWriter(new System.IO.StringWriter(emailbuilder));
  objxslt.Transform(xpathnav, xslarg, xmlwriter, null);

以上是来自SendMail方法的代码片段。通过使用XsltArgumentlist对象的AddExtensionObject方法,将参数添加到XslTransform对象。

string subjecttext, bodytext;

XmlDocument xemaildoc = new XmlDocument();
xemaildoc.LoadXml(emailbuilder.ToString());
XmlNode titlenode = xemaildoc.SelectSingleNode("//title");

subjecttext = titlenode.InnerText;

XmlNode bodynode = xemaildoc.SelectSingleNode("//body");

bodytext = bodynode.InnerXml;
if (bodytext.Length > 0)
{
    bodytext = bodytext.Replace("&amp","&");
}

SendEmail(emailto, subjecttext, bodytext);

以上代码显示了XHTML文档的标题文本,用作电子邮件的主题,以及正文文本,用作电子邮件的正文部分。这是通过简单的XPath完成的。

使用XSLT和XSLTArgumentList的电子邮件模板 - CodeProject - 代码之家
© . All rights reserved.