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






3.85/5 (9投票s)
2005年2月16日
1分钟阅读

106019

1613
在XSLT转换中使用自定义.NET对象。
引言
本文使用XSLT文件作为模板文件来存储电子邮件模板。它专门针对在XSLT文件中使用自定义对象属性。
背景
除了C#和ASP.NET之外,还需要具备XML、XPath和XSLT的基本知识。
使用代码
为了尽可能地通用,EmailProject中的Email.cs类可以分解为其他各种组件。此外,User.cs和Account.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()
函数设置User
和Account
对象的值。这些对象被发送用作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("&","&");
}
SendEmail(emailto, subjecttext, bodytext);
以上代码显示了XHTML文档的标题文本,用作电子邮件的主题,以及正文文本,用作电子邮件的正文部分。这是通过简单的XPath完成的。