先创建数据然后生成相应的xml文件
DataSet ds = new DataSet();
#region Parent Table
DataTable dt1 = new DataTable("Parent");
dt1.Columns.Add(new DataColumn("ParentID", typeof(int)));
dt1.Columns.Add(new DataColumn("Text", typeof(string)));
//UniqueConstraint uc = new UniqueConstraint("ParentIDKey", dt1.Columns[0], true);
//dt1.Constraints.Add(uc);
for (int i = 1; i < 10; i++)
{
dt1.Rows.Add(i, "parent" + i.ToString());
}
#endregion
#region ChildTable
DataTable dt2 = new DataTable("Child");
dt2.Columns.Add(new DataColumn("ChildID", typeof(int)));
dt2.Columns.Add(new DataColumn("Text", typeof(string)));
dt2.Columns.Add(new DataColumn("ParentID", typeof(int)));
//UniqueConstraint uc2 = new UniqueConstraint("ChildIDKey", dt2.Columns[2], true);
//dt2.Constraints.Add(uc2);
for (int i = 0; i < dt1.Rows.Count; i++)
{
if (i == 3 || i == 7)
{
for (int j = 1; j < 10; j++)
{
dt2.Rows.Add(j + i * 9, "Child" + j.ToString(), i + 1);
}
}
}
//ForeignKeyConstraint fkc = new ForeignKeyConstraint("ParentChildID", dt1.Columns[0], dt1.Columns[2]);
//dt2.Constraints.Add(fkc);
dt2.Constraints.Add("ParentChildID", dt1.Columns[0], dt2.Columns[2]);
#endregion
ds.Merge(dt1);
ds.Merge(dt2);
XmlDocument xml =new XmlDocument();
XmlNode root=xml.CreateElement("Root");
xml.AppendChild(root);
for (int i = 0; i < dt1.Rows.Count; i++)
{
XmlElement node = xml.CreateElement("Data");
node.SetAttribute("ID", dt1.Rows[i][0].ToString());
node.SetAttribute("Text", dt1.Rows[i][1].ToString());
bool hasChild = false;
int filter = i + 1;
DataRow[] rows = dt2.Select("ParentID=" + filter);
if (rows.Length > 0)
hasChild = true;
node.SetAttribute("HasChild", hasChild.ToString());
#region child
if (hasChild)
{
for(int j=0;j<rows.Length;j++){
XmlElement childNode = xml.CreateElement("ChildData");
childNode.SetAttribute("ID", rows[j][0].ToString());
childNode.SetAttribute("Text", rows[j][1].ToString());
childNode.SetAttribute("ParentID", rows[j][2].ToString());
node.AppendChild(childNode);
}
}
#endregion
root.AppendChild(node);
}
string xmlText = @"<?xml version='1.0' encoding='iso-8859-1'?> <?xml-stylesheet type='text/xsl' href='data.xsl'?> "+xml.InnerXml.ToString();
//this.webBrowser1.DocumentText = xmlText;
string path = Application.StartupPath + "/data.xml";
File.WriteAllText(path, xmlText);
this.webBrowser1.Navigate(path);
然后生成xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<html>
<head></head>
<body>
<table>
<tr>
<td>ID</td>
<td>Text</td>
</tr>
<xsl:for-each select="*/Data">
<tr>
<td>
<xsl:value-of select="@ID"/>
</td>
<td>
<xsl:variable name="pid" select="@ID">
</xsl:variable>
<xsl:choose >
<xsl:when test="@HasChild='True'">
<table>
<xsl:for-each select="//ChildData">
<tr>
<td>
<xsl:choose>
<xsl:when test="@ParentID=$pid">
<xsl:value-of select="@Text"/>
</xsl:when>
</xsl:choose>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:when>
<xsl:when test="@HasChild='False'">
<xsl:value-of select="@Text"/>
</xsl:when>
</xsl:choose>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
就可以了