Click here to Skip to main content
13,200,202 members (56,204 online)
Click here to Skip to main content
Add your own
alternative version


35 bookmarked
Posted 15 Feb 2005

Email Template using XSLT and XSLTArgumentList

, 15 Feb 2005
Rate this:
Please Sign up or sign in to vote.
Usage of custom .NET objects in XSLT transformation.

Sample Image


This article uses an XSLT file as a template file to store email templates. It specifically targets on usage of Custom Objects Properties to be used in the XSLT file.


Basic knowledge of XML, XPath and XSLT is needed apart from C# and ASP.NET.

Using the code

The Email.cs class in EmailProject can be segregated into various other components to make it as generic as possible. Also, the User.cs and Account.cs class files can be placed in a separate project containing the business objects for the application.

The following are the extracts from the email.cs file:

public static void SetUserDetails()
  User myuser = new User();
  myuser.UserName = "ABC";
  myuser.EmailAddress =;
  Account myaccount = new Account();
  myaccount.AccountName = "ABC Account";
  Hashtable objHash = new Hashtable();
  objHash["ext:User"] = myuser;
  objHash["ext:Account"] = myaccount;
  SendEmail("", "emailtemplate.xslt", objHash);

The SetUserDetails() function sets the values of User and Account objects. These are objects sent to be used as arguments to the XSLT file. Hence they are added to a HashTable object with the key name as the same as their respective xmlns namespace identifiers in the XSLT file, as shown below.

<?xml version="1.0" encoding="UTF-8" ?>
  <xsl:stylesheet version="1.0" xmlns:xsl=""


XslTransform objxslt = new XslTransform();
objxslt.Load(templatepath + xslttemplatename);
XmlDocument xmldoc = new XmlDocument();
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);

The above is the code snippet from SendMail method. The arguments to the XslTransform object are added by using the AddExtensionObject method of XsltArgumentlist object.

string subjecttext, bodytext;

XmlDocument xemaildoc = new XmlDocument();
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);

The above code shows the title text of the XHTML doc to be used as the e-mail's subject and the body text to use used as the body section of the email. This is done by simple XPath.


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

United States United States
No Biography provided

You may also be interested in...


Comments and Discussions

GeneralAccess properties of Associated Objects Pin
jnapier175-May-06 7:09
memberjnapier175-May-06 7:09 
Generaltaking one more step Pin
y6y6y27-Mar-06 15:20
membery6y6y27-Mar-06 15:20 
GeneralRe: taking one more step Pin
Mahendra N29-Mar-06 18:11
memberMahendra N29-Mar-06 18:11 
GeneralRe: taking one more step [modified] Pin
Cvetomir Todorov16-Aug-07 21:00
memberCvetomir Todorov16-Aug-07 21:00 
That can surely do.

You write your object with all parameters needed for the transformation and you serialize it in XML.
For example:

public class MailData
private string receiverName;
private List<int> receiverBills = new List<int>();

public string ReceiverName
get { return receiverName; }
set { receiverName = value; }

public List<int> Bills
get { return receiverBills; }

If you create it with MailData m = new MailData();
m.ReceiverName = "bob";

When you serialize it it will look like:
<?xml version="1.0" ?>

You can then use the XSLCompiledTransform class and call Load to load the XSLT file.
You can call then the Transform method passing it an XmlReader with the serialized mail data
and an XmlWriter to write the output stream which is the result of the transformation.

In the XSLT file looping is like this:
<xsl:for-each select="mailData/bills/bill">
<xsl:value-of select="." />

I feel like I am going to write a short article about it though Smile | :)

-- modified at 6:18 Friday 17th August, 2007

Software modules coupling is the path to the dark side.
Coupling leads to complexity.
Complexity leads to confusion.
Confusion leads to suffering.
Once you start down the dark path, forever will it dominate your destiny, consume you it will!

GeneralRe: taking one more step Pin
cbreier11-Jul-06 5:14
membercbreier11-Jul-06 5:14 
GeneralRe: taking one more step Pin
the__turtle11-Jul-06 21:52
memberthe__turtle11-Jul-06 21:52 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.171020.1 | Last Updated 16 Feb 2005
Article Copyright 2005 by MahendraNepali
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid