做一个用XML、XSL以及JS代码生成的树结构
来源:互联网 发布:类似突袭的电影 知乎 编辑:程序博客网 时间:2024/06/08 07:02
有许多朋友对需要一个用XML数据配合XSL样式表做一个树型机构,但网上一直没有一个完整的DEMO,为了解决这个问题,我花费了几天的时间给大家做了一个,在这里和大家一起分享。
1、效果图如下:
2、XML数据格式如下:
<?xml version="1.0" encoding="utf-8" ?>
<table>
<person>
<id>1</id>
<name>人物</name>
<parent>0</parent>
<Layer>0</Layer>
<Childs>2</Childs>
<TreeLine>0</TreeLine>
<Image>../TreeImg/openFolder.gif</Image>
<Url>#</Url>
</person>
<person>
<id>2</id>
<name>武将</name>
<parent>1</parent>
<Layer>1</Layer>
<Childs>3</Childs>
<TreeLine>0</TreeLine>
<Image>../TreeImg/openFolder.gif</Image>
<Url>#</Url>
</person>
<person>
<id>3</id>
<name>文臣</name>
<parent>1</parent>
<Layer>1</Layer>
<Childs>3</Childs>
<TreeLine>0</TreeLine>
<Image>../TreeImg/openFolder.gif</Image>
<Url>#</Url>
</person>
<person>
<id>4</id>
<name>魏延</name>
<parent>2</parent>
<Layer>2</Layer>
<Childs>0</Childs>
<TreeLine>0</TreeLine>
<Image>../TreeImg/file1.gif</Image>
<Url>#</Url>
</person>
<person>
<id>5</id>
<name>赵云</name>
<parent>2</parent>
<Layer>2</Layer>
<Childs>2</Childs>
<TreeLine>0</TreeLine>
<Image>../TreeImg/openFolder.gif</Image>
<Url>#</Url>
</person>
<person>
<id>6</id>
<name>何平</name>
<parent>2</parent>
<Layer>2</Layer>
<Childs>0</Childs>
<TreeLine>1</TreeLine>
<Image>../TreeImg/file2.gif</Image>
<Url>#</Url>
</person>
<person>
<id>7</id>
<name>荀域</name>
<parent>3</parent>
<Layer>2</Layer>
<Childs>0</Childs>
<TreeLine>0</TreeLine>
<Image>../TreeImg/file2.gif</Image>
<Url>#</Url>
</person>
<person>
<id>8</id>
<name>荀攸</name>
<parent>3</parent>
<Layer>2</Layer>
<Childs>0</Childs>
<TreeLine>0</TreeLine>
<Image>../TreeImg/file2.gif</Image>
<Url>#</Url>
</person>
<person>
<id>9</id>
<name>鲁肃</name>
<parent>3</parent>
<Layer>2</Layer>
<Childs>0</Childs>
<TreeLine>1</TreeLine>
<Image>../TreeImg/file2.gif</Image>
<Url>#</Url>
</person>
<person>
<id>10</id>
<name>赵统</name>
<parent>5</parent>
<Layer>3</Layer>
<Childs>0</Childs>
<TreeLine>0</TreeLine>
<Image>../TreeImg/file2.gif</Image>
<Url>#</Url>
</person>
<person>
<id>11</id>
<name>赵广</name>
<parent>5</parent>
<Layer>3</Layer>
<Childs>0</Childs>
<TreeLine>1</TreeLine>
<Image>../TreeImg/file2.gif</Image>
<Url>#</Url>
</person>
<person>
<id>13</id>
<name>狗</name>
<parent>12</parent>
<Layer>1</Layer>
<Childs>0</Childs>
<TreeLine>0</TreeLine>
<Image>../TreeImg/file2.gif</Image>
<Url>#</Url>
</person>
<person>
<id>14</id>
<name>猫</name>
<parent>12</parent>
<Layer>1</Layer>
<Childs>0</Childs>
<TreeLine>1</TreeLine>
<Image>../TreeImg/file2.gif</Image>
<Url>#</Url>
</person>
<person>
<id>12</id>
<name>动物</name>
<parent>0</parent>
<Layer>0</Layer>
<Childs>2</Childs>
<TreeLine>0</TreeLine>
<Image>../TreeImg/openFolder.gif</Image>
<Url>#</Url>
</person>
<person>
<id>15</id>
<name>植物</name>
<parent>0</parent>
<Layer>0</Layer>
<Childs>0</Childs>
<TreeLine>1</TreeLine>
<Image>../TreeImg/file2.gif</Image>
<Url>#</Url>
</person>
</table>
3、XSL样式表如下
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="table">
<TABLE cellspacing="0" cellpadding="1" style="vertical-align:top;">
<TR>
<TD STYLE="cursor:hand">
<xsl:apply-templates select="//person[parent=0]"/>
</TD>
</TR>
</TABLE>
</xsl:template>
<xsl:template match="//person">
<xsl:param name="id" select="id"/>
<div id="{$id}">
<xsl:attribute name="Class">
Navigator
</xsl:attribute>
<xsl:attribute name="ParentId">
<xsl:value-of select="parent"/>
</xsl:attribute>
<xsl:attribute name="Depth">
<xsl:value-of select="Layer"/>
</xsl:attribute>
<xsl:if test="Childs[.>0]">
<xsl:attribute name="Expanded">yes</xsl:attribute>
</xsl:if>
<xsl:if test="Layer=1">
<IMG src="../TreeImg/t_Line.png"></IMG>
</xsl:if>
<xsl:if test="Layer=2">
<IMG src="../TreeImg/t_Line.png"></IMG>
<IMG src="../TreeImg/t_Line.png"></IMG>
</xsl:if>
<xsl:if test="Layer=3">
<IMG src="../TreeImg/t_Line.png"></IMG>
<IMG src="../TreeImg/t_Line.png"></IMG>
<IMG src="../TreeImg/t_Line.png"></IMG>
</xsl:if>
<xsl:if test="Layer=4">
<IMG src="../TreeImg/t_Line.png"></IMG>
<IMG src="../TreeImg/t_Line.png"></IMG>
<IMG src="../TreeImg/t_Line.png"></IMG>
<IMG src="../TreeImg/t_Line.png"></IMG>
</xsl:if>
<xsl:if test="Layer=5">
<IMG src="../TreeImg/t_Line.png"></IMG>
<IMG src="../TreeImg/t_Line.png"></IMG>
<IMG src="../TreeImg/t_Line.png"></IMG>
<IMG src="../TreeImg/t_Line.png"></IMG>
<IMG src="../TreeImg/t_Line.png"></IMG>
</xsl:if>
<xsl:choose>
<xsl:when test="count(//person[parent=$id]) > 0">
<img id="img1{$id}" src="../TreeImg/t_Minus.png">
<xsl:attribute name="onclick">
toggle('<xsl:value-of select="id" />','<xsl:value-of select="Layer" />')
</xsl:attribute>
</img>
<img id="img2{$id}" src="../TreeImg/openFolder.gif">
<xsl:attribute name="onclick">
toggle('<xsl:value-of select="id" />','<xsl:value-of select="Layer" />')
</xsl:attribute>
</img>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="TreeLine[.>0]">
<img src="../TreeImg/l_Leaf.png"></img>
</xsl:when>
<xsl:otherwise>
<img src="../TreeImg/t_Leaf.png"></img>
</xsl:otherwise>
</xsl:choose>
<img>
<xsl:attribute name="src">
<xsl:value-of select="Image" />
</xsl:attribute>
</img>
</xsl:otherwise>
</xsl:choose>
<A>
<xsl:attribute name="onclick">
openwin('<xsl:value-of select="Url" />','<xsl:value-of select="@name" />')
</xsl:attribute>
<xsl:value-of select="name"/>
</A>
</div>
<div id="s{$id}">
<xsl:apply-templates select="//person[parent=$id]"/>
</div>
</xsl:template>
</xsl:stylesheet>
3、JS代码如下:
// 鼠标点击树进行展开和折叠
function toggle(id,dep)
{
var thisRow = document.all.item(id);
if (thisRow)
{
var i = parseInt(dep)*2;
var d = parseInt(i) + parseInt("1");
if (thisRow.getAttribute("Expanded") == "yes")
{
thisRow.setAttribute("Expanded", "no");
thisRow.children(parseInt(i)).src = "../TreeImg/t_plus.png";
thisRow.children(parseInt(d)).src = "../TreeImg/closeFolder.gif";
var allRows = document.all.tags("div");
for (var i=1; i < allRows.length; i++)
{
var row = allRows[i];
if (row.getAttribute("ParentId") == id)
{
if (row.getAttribute("Expanded") == "yes")
{
toggle(row.getAttribute("id"),row.getAttribute("Depth"));
}
row.className = "Navigator-Hidden";
}
}
thisRow.className = "Navigator";
}
else
{
thisRow.setAttribute("Expanded", "yes");
thisRow.children(parseInt(i)).src = "../TreeImg/t_Minus.png";
thisRow.children(parseInt(d)).src = "../TreeImg/openFolder.gif";
var allRows = document.all.tags("div");
var depth = parseInt(thisRow.getAttribute("Depth"));
for (var i=1; i < allRows.length; i++)
{
var row = allRows[i];
if (row.getAttribute("ParentId") == id && parseInt(row.getAttribute("Depth")) == depth + 1 )
{
row.className = "Navigator";
}
}
}
}
}
4、用到的样式如下
<style type="text/css">
/*树形控件用到*/
DIV IMG
{
MARGIN-BOTTOM: 0px;
MARGIN-RIGHT: 1px;
MARGIN-TOP: -4px;
VERTICAL-ALIGN: middle
}
DIV A:hover
{
BACKGROUND-COLOR: greenyellow
}
.Navigator
{
color: #003366;
}
.Navigator-Hidden
{
display:none;
}
</style>
5、DEMO代码如下
function window.onload()
{
// 主数据区 XmlSysModule.aspx
//var sXMLFile = "XmlFile/OAFILE.xml";
//var sXSLTFile = "XslFile/XslTreeMenu.xsl";
var sXMLFile = "XslFile/XMLFile1.xml";
var sXSLTFile = "XslFile/XSLTFile1.xslt";
GetHTML(sXMLFile,sXSLTFile,"oHtmlLeft");
}
function openwin(URL,mytitle)
{
window.open(URL,"ifMain","");
parent.document.title=mytitle;
}
//-->
</script>
</head>
<body style="background-color:#E2E9FF;">
<div id="oHtmlLeft" style="padding-left:2px; padding-top:5px;"></div>
</body>
</html>
6、需要源程序的朋友请留言
- 做一个用XML、XSL以及JS代码生成的树结构
- 一个xml+xsl生成的树
- 用xml和xsl做网页实例
- xml+xsl生成html的方法
- 别人做的一个XML+XSL的实例(值得初学者收藏)
- 利用xml+xsl快速生成大量JSP的常用代码的方法.
- JS读取XML字符串生成树结构
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- C#分析数据库结构,使用XSL模板自动生成代码
- 用js动态倒入xml|xsl脚本
- 用xsl和xml加js处理
- XML,XSL,XSLT,XPath 以及 XSL-FO
- JS调用XSL解析XML
- xsl实战:通过xml生成功能菜单树
- Sparks.com用XML和XSL来生成动态页面
- Linux时区、时间的更改
- 浮选机的使用和保养注意事项
- XML 优化项目实践
- HP Mercury QTP 10的下载、破解和新功能
- LINQ to SQL语句(17)之对象加载
- 做一个用XML、XSL以及JS代码生成的树结构
- Linux下防御arp攻击策略
- gcc和g++的区别
- JavaScript 获取客户端计算机硬件及系统信息
- Ext for eclipse 插件安装方法
- xml实战:一 把表转化为XML
- chm格式文件打开出错:无法显示网页
- C++ 引用
- 同一列中加多个链接