使用XML实现BBS(主题列表篇)
2023-06-13 09:13:44 时间
表A:
1-0-1,thisisatest
3-1-1,thisisatest
4-3-1,thisisatest
5-3-1,thisisatest
2-0-2,thisisatest
上面是BBS主题列表的一个例子。一般来说,假如不是使用Oracle(Oracle有一条查询语句可以自动生成家族树,请查阅Select...startwith...connectby...语句),那么如何实现上例的列表是一件费事的工作(相信许多程序员都写过)。
如果我们改用XML来实现,那么结果会怎么样呢?
现在我们使用"Select*frombbs"从数据库中查询贴子,并以XML格式返回(如果你是用ADO,那么可以用其RecordSet.Save...adPersistXML直接生成,当然如果你不喜欢ADO生成的格式,可用程序生成,如本例):
表B:
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl"href="b.xsl"?>
<bbs>
<postsid="4"pid="3"aid="1">
<title>4-3-1,thisisatest</title>
<content>slddfjslajfsdljf</content>
</post>
<postsid="5"pid="3"aid="1">
<title>5-3-1,thisisatest</title>
<content>slddfjslajfsdljf</content>
</post>
<postsid="3"pid="1"aid="1">
<title>3-1-1,thisisatest</title>
<content>slddfjslajfsdljf</content>
</post>
<postsid="1"pid="0"aid="1">
<title>1-0-1,thisisatest</title>
<content>slddfjslajfsdljf</content>
</post>
<postsid="2"pid="0"aid="2">
<title>2-0-2,thisisatest</title>
<content>slddfjslajfsdljf</content>
</post>
</bbs>
说明:这里sid是贴子的id号,pid是贴子的父id号。title是标题,content是贴子的内容。
上表中第二行是指定使用b.XSL来转换XML内容。这是提供给IE5的信息。假如你使用XMLDOM,那么可以不要这条信息。
我们再来看看将上表的XML内容显示成表A形式的XSL文件是怎么实现的:
表C:b.XSL
<?xmlversion=""1.0""?>
<xsl:stylesheetxmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:templatematch="/">
<html>
<body>
<xsl:apply-templatesselect="*"/>
</body>
</html>
</xsl:template>
<xsl:templatematch="post">
<li>
<div>
<xsl:attributename="title"><xsl:value-ofselect="content"/></xsl:attribute>
<xsl:value-ofselect="title"/>
<xsl:iftest="/bbs/post[@pid=context()/@sid]">
<xsl:elementname="ul">
<xsl:apply-templatesselect="/bbs/post[@pid=context()/@sid]"/>
</xsl:element>
</xsl:if>
</div>
</li>
</xsl:template>
<xsl:templatematch="bbs">
<ul>
<xsl:apply-templatesselect="post[@pid=0]"/>
</ul>
</xsl:template>
</xsl:stylesheet>
现在,你将表B的内容存为abc.xml,将表C的内容存为b.xsl,然后在IE5中打开,你就可以看到和表A一样的内容了。
因此可以看出,XSL文件解定了最终的显示结果。假如你有多个子论坛,那么无需更改论坛程序,只要为各个子论坛提供不同XSL文件,就可以让各个子论坛的版而不论风格画面还是主题排列都会具有独特的表现。如果提供免费论坛服务,那么允许论坛申请者定制自已的XSL文件将是一个良好的选择。
但是假如客户端不支持XML,该怎么办呢?答案很简单,由服务端先将XML转换成HTML,再传到客户端。
下面我们以IIS4/5+IE5+ASP来实现这个例子(服务器必需安装IE5):
<%@LANGUAGE=JScript%>
<%
SetrsXML=Server.CreateObject("ADODB.RecordSet");
sSQL=“SELECT*frombbs"
sConn=“你自个儿写”
rsXML.CursorLocation=adUseClient
rsXML.OpensSQL,sConn,adOpenStatic
//指定XSL文件位置
varstyleFile=Server.MapPath("simple.xsl");
//SavetheXMLtoXMLDOM
varsource=Server.CreateObject("Microsoft.XMLDOM");
""rsXML.Savesource,adPersistXML
""我相当不喜欢ADO直接Save出来的XML文档,我总是这样做:
DimGetData,v
GetData=GetData&"<bbs>"
whilenotRS_ForumInfo.EOF
GetData=GetData&"<post>"
fori=0toRS_ForumInfo.Fields.Count-1
setv=RS_ForumInfo.Fields.Item(i)
if(v.Type=201)or(v.Type=203)or(v.Type=205)then
GetData=GetData&"<"&RS_ForumInfo.Fields.Item(i).Name&">"&_
"<![CDATA["&RS_ForumInfo.Fields.Item(i).Value&"]]>"&_
"</"&RS_ForumInfo.Fields.Item(i).Name&">"
else
GetData=GetData&"<"&RS_ForumInfo.Fields.Item(i).Name&">"&_
RS_ForumInfo.Fields.Item(i).Value&_
"</"&RS_ForumInfo.Fields.Item(i).Name&">"
endif
setv=Nothing
next
GetData=GetData&"</post>"
RS_ForumInfo.MoveNext
wend
GetData=GetData&"</bbs>"
source.loadXMLGetData
//LoadtheXSL
varstyle=Server.CreateObject("Microsoft.XMLDOM");
style.async=false;
style.load(styleFile);
Response.Write(source.transformNode(style));
%>
当然,由于此处为了简便,直接使用ADO来生成XML,因此simple.xsl和上面的b.xsl是不同的。
读者可以参考上例和XSL参考资料(2000年的MSDN有比较详细的XML/XSLSDK文档)来编写。(完)
1-0-1,thisisatest
3-1-1,thisisatest
4-3-1,thisisatest
5-3-1,thisisatest
2-0-2,thisisatest
上面是BBS主题列表的一个例子。一般来说,假如不是使用Oracle(Oracle有一条查询语句可以自动生成家族树,请查阅Select...startwith...connectby...语句),那么如何实现上例的列表是一件费事的工作(相信许多程序员都写过)。
如果我们改用XML来实现,那么结果会怎么样呢?
现在我们使用"Select*frombbs"从数据库中查询贴子,并以XML格式返回(如果你是用ADO,那么可以用其RecordSet.Save...adPersistXML直接生成,当然如果你不喜欢ADO生成的格式,可用程序生成,如本例):
表B:
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl"href="b.xsl"?>
<bbs>
<postsid="4"pid="3"aid="1">
<title>4-3-1,thisisatest</title>
<content>slddfjslajfsdljf</content>
</post>
<postsid="5"pid="3"aid="1">
<title>5-3-1,thisisatest</title>
<content>slddfjslajfsdljf</content>
</post>
<postsid="3"pid="1"aid="1">
<title>3-1-1,thisisatest</title>
<content>slddfjslajfsdljf</content>
</post>
<postsid="1"pid="0"aid="1">
<title>1-0-1,thisisatest</title>
<content>slddfjslajfsdljf</content>
</post>
<postsid="2"pid="0"aid="2">
<title>2-0-2,thisisatest</title>
<content>slddfjslajfsdljf</content>
</post>
</bbs>
说明:这里sid是贴子的id号,pid是贴子的父id号。title是标题,content是贴子的内容。
上表中第二行是指定使用b.XSL来转换XML内容。这是提供给IE5的信息。假如你使用XMLDOM,那么可以不要这条信息。
我们再来看看将上表的XML内容显示成表A形式的XSL文件是怎么实现的:
表C:b.XSL
<?xmlversion=""1.0""?>
<xsl:stylesheetxmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:templatematch="/">
<html>
<body>
<xsl:apply-templatesselect="*"/>
</body>
</html>
</xsl:template>
<xsl:templatematch="post">
<li>
<div>
<xsl:attributename="title"><xsl:value-ofselect="content"/></xsl:attribute>
<xsl:value-ofselect="title"/>
<xsl:iftest="/bbs/post[@pid=context()/@sid]">
<xsl:elementname="ul">
<xsl:apply-templatesselect="/bbs/post[@pid=context()/@sid]"/>
</xsl:element>
</xsl:if>
</div>
</li>
</xsl:template>
<xsl:templatematch="bbs">
<ul>
<xsl:apply-templatesselect="post[@pid=0]"/>
</ul>
</xsl:template>
</xsl:stylesheet>
现在,你将表B的内容存为abc.xml,将表C的内容存为b.xsl,然后在IE5中打开,你就可以看到和表A一样的内容了。
因此可以看出,XSL文件解定了最终的显示结果。假如你有多个子论坛,那么无需更改论坛程序,只要为各个子论坛提供不同XSL文件,就可以让各个子论坛的版而不论风格画面还是主题排列都会具有独特的表现。如果提供免费论坛服务,那么允许论坛申请者定制自已的XSL文件将是一个良好的选择。
但是假如客户端不支持XML,该怎么办呢?答案很简单,由服务端先将XML转换成HTML,再传到客户端。
下面我们以IIS4/5+IE5+ASP来实现这个例子(服务器必需安装IE5):
<%@LANGUAGE=JScript%>
<%
SetrsXML=Server.CreateObject("ADODB.RecordSet");
sSQL=“SELECT*frombbs"
sConn=“你自个儿写”
rsXML.CursorLocation=adUseClient
rsXML.OpensSQL,sConn,adOpenStatic
//指定XSL文件位置
varstyleFile=Server.MapPath("simple.xsl");
//SavetheXMLtoXMLDOM
varsource=Server.CreateObject("Microsoft.XMLDOM");
""rsXML.Savesource,adPersistXML
""我相当不喜欢ADO直接Save出来的XML文档,我总是这样做:
DimGetData,v
GetData=GetData&"<bbs>"
whilenotRS_ForumInfo.EOF
GetData=GetData&"<post>"
fori=0toRS_ForumInfo.Fields.Count-1
setv=RS_ForumInfo.Fields.Item(i)
if(v.Type=201)or(v.Type=203)or(v.Type=205)then
GetData=GetData&"<"&RS_ForumInfo.Fields.Item(i).Name&">"&_
"<![CDATA["&RS_ForumInfo.Fields.Item(i).Value&"]]>"&_
"</"&RS_ForumInfo.Fields.Item(i).Name&">"
else
GetData=GetData&"<"&RS_ForumInfo.Fields.Item(i).Name&">"&_
RS_ForumInfo.Fields.Item(i).Value&_
"</"&RS_ForumInfo.Fields.Item(i).Name&">"
endif
setv=Nothing
next
GetData=GetData&"</post>"
RS_ForumInfo.MoveNext
wend
GetData=GetData&"</bbs>"
source.loadXMLGetData
//LoadtheXSL
varstyle=Server.CreateObject("Microsoft.XMLDOM");
style.async=false;
style.load(styleFile);
Response.Write(source.transformNode(style));
%>
当然,由于此处为了简便,直接使用ADO来生成XML,因此simple.xsl和上面的b.xsl是不同的。
读者可以参考上例和XSL参考资料(2000年的MSDN有比较详细的XML/XSLSDK文档)来编写。(完)
相关文章
- Python编程 列表的操作(上)
- 【说站】python ChainMap如何管理映射列表
- gridview样式模板_css列表样式
- transition-group列表过渡
- 类——构造函数之初始化列表
- Linux下C语言解析XML文件快速入门(linuxc解析xml)
- 表管理MySQL分区管理:构建分区列表(mysql分区列)
- Oracle数据库实现XML解析(oracle解析xml)
- 作为 HTTPS 的骨灰粉,怎么可以不加入 HSTS 预载入列表
- MSSQL 中 XML 查询的实践(mssql查询xml)
- 使用MySQL中XML实现条件判断(mysql中xml判断)
- XML配置,实现Redis安全访问(xml配置redis密码)
- 使用MySQL实现XML数据导入(mysql xml 导入)
- 使用MySQL将XML数据存储起来,轻松高效地管理和访问(mysql xml 存储)
- MySQL与XML实现数据分页(mysql xml分页)
- MySQL中的XML函数简介(mysql xml函数)
- 一网打尽如何在Redis中高效排序大型列表(大列表排序redis)
- 数据Oracle中的XML数据导入指南(oracle中导入xml)
- Oracle中高效处理XML的方法(oracle中处理xml)
- 深入了解MySQL XML数据库数据存储和管理的细节(mysql xml数据库)
- Redis配置文件XML化一种新的解决方案(redis配置文件xml)
- Oracle XML转换为表格形式简单几步即可实现(oracle xml转表)
- Oracle中XML数据的读取研究(oracle xml读取)
- 写了段批量抓取某个列表页的东东
- 仿淘宝首页分类列表效果实现代码
- 怎样打开XML文件?xml文件如何打开?
- asp.net(文章截取前几行作为列表摘要)无损返回HTML代码