This simple program demostrate how to create well formatted MS Word documents using C#, XML and XSLT. Using XSLT to create Word document requires the knowledge of RTF key words. RTF specification is available in MSDN site.
1. Open Visual Studio .NET and select File --> New --> Project.
2. Select Visual C# project as the Project Type and Windows Application as the Template. For the project name, specify 'CShartXSLT'; for the path specify the location where you want the project to be created. Click OK to create the new project.
3. Add an XML file named "Employee.xml" in \Debug\Bin directory (other wise you have to specify the path in the program). The structure of the file will be like,
<?xml version="1.0" encoding="utf-8" ?>
<Employee>
<Record>
<EmpID>E1</EmpID>
<EmpName>Sudipta</EmpName>
<EmpAge>29</EmpAge>
<EmpSex>M</EmpSex>
<EmpAddress>Kolkata</EmpAddress>
<Department>
<DeptID>D1</DeptID>
<EmpID>E1</EmpID>
<DeptName>Sales</DeptName>
</Department>
</Record>
<Record>
<EmpID>E2</EmpID>
<EmpName>Chiranjib</EmpName>
<EmpAge>26</EmpAge>
<EmpSex>M</EmpSex>
<EmpAddress>Kolkata</EmpAddress>
<Department>
<DeptID>D1</DeptID>
<EmpID>E2</EmpID>
<DeptName>Sales</DeptName>
</Department>
</Record>
<Record>
<EmpID>E3</EmpID>
<EmpName>Nilanjan</EmpName>
<EmpAge>29</EmpAge>
<EmpSex>M</EmpSex>
<EmpAddress>Kolkata</EmpAddress>
<Department>
<DeptID>D2</DeptID>
<EmpID>E3</EmpID>
<DeptName>Finance</DeptName>
</Department>
</Record>
<Record>
<EmpID>E4</EmpID>
<EmpName>Chayan</EmpName>
<EmpAge>30</EmpAge>
<EmpSex>M</EmpSex>
<EmpAddress>Kolkata</EmpAddress>
<Department>
<DeptID>D3</DeptID>
<EmpID>E4</EmpID>
<DeptName>Human Resource</DeptName>
</Department>
</Record>
<Record>
<EmpID>E5</EmpID>
<EmpName>Biplab</EmpName>
<EmpAge>31</EmpAge>
<EmpSex>M</EmpSex>
<EmpAddress>Kolkata</EmpAddress>
<Department>
<DeptID>D4</DeptID>
<EmpID>E5</EmpID>
<DeptName>Administration</DeptName>
</Department>
</Record>
</Employee>
4. Add an XSLT file named "Employee.xslt" in \Debug\Bin directory (other wise you have to specify the path in the program). The structure of the file will be like,
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:dt="urn:schemas-microsoft-com:datatypes" xmlns:user="urn:my-scripts">
<xsl:output method="text" />
<xsl:template match="Employee">
<xsl:text>{\rtf1\fs22</xsl:text>
<!--Print the Header Row-->
<xsl:text>\trowd\cellx2500\cellx3000\cellx3800\cellx6800\cellx9144\intbl\keepn\ql\b Name\cell Age\cell Sex\cell Address\cell Department\cell</xsl:text>
<xsl:text>\b0\ql0\intbl\row</xsl:text>
<!--Print Employee Records-->
<xsl:apply-templates select="Record" />
<xsl:text>}</xsl:text>
</xsl:template>
<xsl:template match="Record">
<xsl:text>\trowd\cellx2500\cellx3000\cellx3800\cellx6800\cellx9144\intbl\keepn\ql </xsl:text>
<xsl:value-of select="EmpName" />
<xsl:text>\cell </xsl:text>
<xsl:value-of select="EmpAge" />
<xsl:text>\cell </xsl:text>
<xsl:if test="EmpSex='M'">
<xsl:text>Male</xsl:text>
<xsl:text>\cell </xsl:text>
</xsl:if>
<xsl:if test="EmpSex='F'">
<xsl:text>Female</xsl:text>
<xsl:text>\cell </xsl:text>
</xsl:if>
<xsl:value-of select="EmpAddress" />
<xsl:text>\cell </xsl:text>
<!--Print Employee Department-->
<xsl:apply-templates select="Department" />
<xsl:text>\cell</xsl:text>
<xsl:text>\intbl\row</xsl:text>
</xsl:template>
<xsl:template match="Department">
<xsl:value-of select="DeptName" />
</xsl:template>
</xsl:stylesheet>
5. In Form1.cs, add the following references
using
System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.XPath;
using System.IO;
6. In Form1.cs, add a button and write the following code
private void button1_Click(object sender, EventArgs e)
{
DataSet ds;
XmlDataDocument xmlDoc;
XslCompiledTransform xslTran;
XmlElement root;
XPathNavigator nav;
XmlTextWriter writer;
try
{
//Create the DataSet from the XML file
ds = new DataSet();
ds.ReadXml("Employee.xml");
//Create the XML from the DataSet
xmlDoc = new XmlDataDocument(ds);
//Load the XSLT for Transformation
xslTran = new XslCompiledTransform();
xslTran.Load("Employee.xslt");
//Determine the Root object in the XML
root = xmlDoc.DocumentElement;
//Create the XPath Navigator to navigate throuth the XML
nav = root.CreateNavigator();
//First delete the RTF, if already exist
if (File.Exists("Employee.rtf"))
{
File.Delete("Employee.rtf");
}
//Create the RTF by Transforming the XML and XSLT
writer = new XmlTextWriter("Employee.rtf", System.Text.Encoding.Default);
xslTran.Transform(nav, writer);
//Close the Writer after Transformation
writer.Close();
//Release all objects
writer = null;
nav = null;
root = null;
xmlDoc = null;
ds = null;
MessageBox.Show("Document created successfully.....");
}
catch (Exception ex)
{
writer = null;
nav = null;
root = null;
xmlDoc = null;
ds = null;
MessageBox.Show(ex.StackTrace);
}
}
7. Compile and run the program.