用mssql + xml + xslt + js生成动态树(二叉树)

zhangjsl 2004-08-02 11:34:47
本想把这篇文章放到blog上的,结果csdn的blog太难用了……
这几天公司要求做链接树,于是在网上找了一些代码,研究了一下,发现用xml来实现树的管理比较方便,于是自己写了一个简单例子,没有用做效果,希望能抛砖引玉,让大家更多探讨
库结构
w_index /目录表
i_id id
i_title 目录内容
i_bid 所属ID
i_level 层次
这个应该是无级树结构常用的一种数据库结构了,不做过多解释
现在将这个数据库的内容取出,并生成xml
<%
strsql = "select i_id,i_title,i_bid,i_level from w_index"
'设置conn 略
set rs = conn.execute(strsql)
set objXMLDOM = Server.CreateObject("MSXML2.DOMDocument")
Set objXMLDOM_XSLT = server.CreateObject("MSXML2.DOMDocument")
objXMLDOM_XSLT.load(Server.MapPath("createtree.xsl")) '将rs生成的XML格式化为树形
rs.Save objXMLDOM,1
rs.Close
Response.Write "<?xml version='1.0' encoding='GB2312'?>"
strCleanXML = objXMLDOM.transformNode(objXMLDOM_XSLT)
response.write strCleanXML
'树生成完毕,如果树的结构基本不变的话,可以考虑将这个XML保存成一个XML文件,这样使用时就不必重复读取数据库了
%>
createtree.xsl
?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<root>
<xsl:apply-templates select="/xml/rs:data/z:row[@i_bid=0]"/>
</root>
</xsl:template>
<xsl:template match="/xml/rs:data/z:row">
<row>
<xsl:apply-templates select="@*"/>
<xsl:choose>
<xsl:when test="count(/xml/rs:data/z:row[@i_bid=current()/@i_id])=0">
<xsl:attribute name="notetype">page
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="notetype">node
</xsl:attribute>
<xsl:apply-templates select="/xml/rs:data/z:row[@i_bid=current()/@i_id]"/>
</xsl:otherwise>
</xsl:choose>
</row>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>

输出的XML为:
<?xml version="1.0" encoding="GB2312" ?>
- <root xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
- <row i_id="1" i_title="热门赛事新闻" i_bid="0" i_level="0" notetype="node">
- <row i_id="5" i_title="欧洲杯最新报道" i_bid="1" i_level="1" notetype="node">
<row i_id="6" i_title="冠军杯联盟杯" i_bid="5" i_level="1" notetype="page" />
<row i_id="7" i_title="五大联赛看台" i_bid="5" i_level="1" notetype="page" />
<row i_id="8" i_title="其它地区赛事" i_bid="5" i_level="1" notetype="page" />
</row>
</row>
- <row i_id="2" i_title="国内足球新闻" i_bid="0" i_level="0" notetype="node">
<row i_id="9" i_title="中超新闻" i_bid="2" i_level="1" notetype="page" />
<row i_id="10" i_title="中甲新闻" i_bid="2" i_level="1" notetype="page" />
<row i_id="11" i_title="国家队" i_bid="2" i_level="1" notetype="page" />
<row i_id="12" i_title="国奥队" i_bid="2" i_level="1" notetype="page" />
<row i_id="13" i_title="海外球员" i_bid="2" i_level="1" notetype="page" />
</row>
- <row i_id="3" i_title="专业赛事推荐" i_bid="0" i_level="0" notetype="node">
<row i_id="14" i_title="欧洲赛事" i_bid="3" i_level="1" notetype="page" />
<row i_id="15" i_title="其它赛事" i_bid="3" i_level="1" notetype="page" />
<row i_id="16" i_title="飞火看盘" i_bid="3" i_level="1" notetype="page" />
<row i_id="17" i_title="注码分布" i_bid="3" i_level="1" notetype="page" />
<row i_id="18" i_title="标盘推荐" i_bid="3" i_level="1" notetype="page" />
</row>
- <row i_id="4" i_title="即时赔率备忘" i_bid="0" i_level="0" notetype="node">
<row i_id="19" i_title="威廉希尔" i_bid="4" i_level="1" notetype="page" />
<row i_id="20" i_title="立博" i_bid="4" i_level="1" notetype="page" />
<row i_id="21" i_title="澳门彩票" i_bid="4" i_level="1" notetype="page" />
<row i_id="22" i_title="易胜博" i_bid="4" i_level="1" notetype="page" />
</row>
- <row i_id="23" i_title="即时比分查询" i_bid="0" i_level="0" notetype="node">
<row i_id="24" i_title="意甲比分" i_bid="23" i_level="1" notetype="page" />
<row i_id="25" i_title="西甲比分" i_bid="23" i_level="1" notetype="page" />
<row i_id="26" i_title="英超比分" i_bid="23" i_level="1" notetype="page" />
<row i_id="27" i_title="德甲比分" i_bid="23" i_level="1" notetype="page" />
<row i_id="28" i_title="法甲比分" i_bid="23" i_level="1" notetype="page" />
<row i_id="29" i_title="欧洲杯比分" i_bid="23" i_level="1" notetype="page" />
<row i_id="30" i_title="冠军杯比分" i_bid="23" i_level="1" notetype="page" />
<row i_id="31" i_title="其它赛事比分" i_bid="23" i_level="1" notetype="page" />
</row>
- <row i_id="35" i_title="公告:欧洲杯幸运大抽奖new!" i_bid="0" i_level="0" notetype="node">
<row i_id="39" i_title="欧洲杯幸运大抽奖" i_bid="35" i_level="0" notetype="page" />
</row>
<row i_id="40" i_title="欧洲杯烽火(hot)" i_bid="0" i_level="0" notetype="page" />
<row i_id="41" i_title="球星VS性感美女" i_bid="0" i_level="0" notetype="page" />
- <row i_id="42" i_title="我的足彩" i_bid="0" i_level="0" notetype="node">
<row i_id="44" i_title="进球彩对阵表" i_bid="42" i_level="1" notetype="page" />
<row i_id="45" i_title="胜负彩对阵表" i_bid="42" i_level="1" notetype="page" />
<row i_id="46" i_title="足彩即时比分" i_bid="42" i_level="1" notetype="page" />
<row i_id="47" i_title="进球彩结果" i_bid="42" i_level="1" notetype="page" />
<row i_id="48" i_title="胜负彩结果" i_bid="42" i_level="1" notetype="page" />
</row>
</root>

然后在客户端用JS取这个XML内容,依照节点类型(nodetype)来控制创建的行为和设置CSS,这样的代码网上很多,就不再重复了。
此贴仅仅做参考,如有更好的想法和思路,请大家跟贴
...全文
196 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧