1-0-1,this is a test 3-1-1,this is a test 4-3-1,this is a test 5-3-1,this is a test 2-0-2,this is a test
上面是BBS主题列表的一个例子。一般来说,假如不是运用Oracle(Oracle 有一条查询语句能够自动生成家属树,请查阅Select ... startwith ... connect by ...语句),那末怎样完成上例的列表是一件省事的事情(置信很多顺序员都写过)。
假如我们改用xml来完成,那末效果会怎样呢?
如今我们运用"Select * from bbs"从数据库中查询贴子,并以XML花样返回(假如你是用ADO,那末能够用其RecordSet.Save ... adPersistXML直接生成,固然假如你不喜欢ADO生成的花样,可用顺序生成,如本例):
表B:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="b.xsl"?> <bbs> <post sid="4" pid="3" aid="1"> <title>4-3-1,this is a test</title> <content>slddfjslajfsdljf</content> </post> <post sid="5" pid="3" aid="1"> <title>5-3-1,this is a test</title> <content>slddfjslajfsdljf</content> </post> <post sid="3" pid="1" aid="1"> <title>3-1-1,this is a test</title> <content>slddfjslajfsdljf</content> </post> <post sid="1" pid="0" aid="1"> <title>1-0-1,this is a test</title> <content>slddfjslajfsdljf</content> </post> <post sid="2" pid="0" aid="2"> <title>2-0-2,this is a test</title> <content>slddfjslajfsdljf</content> </post> </bbs>
申明:这里sid是贴子的id号,pid是贴子的父id号。title是题目,content是贴子的内容。
上表中第二行是指定运用b.XSL来转换XML内容。这是供应给IE5的信息。假如你运用XMLDOM,那末能够不要这条信息。
我们再来看看将上表的XML内容显现成表A情势的XSL文件是怎样完成的:
表C:b.XSL
<?xml version=''1.0''?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="*"/> </body> </html> </xsl:template> <xsl:template match="post"> <li> <div> <xsl:attribute name="title"><xsl:value-of select="content"/></xsl:attribute> <xsl:value-of select="title"/> <xsl:if test="/bbs/post[@pid=context()/@sid]"> <xsl:element name="ul"> <xsl:apply-templates select="/bbs/post[@pid=context()/@sid]"/> </xsl:element> </xsl:if> </div> </li> </xsl:template> <xsl:template match="bbs"> <ul> <xsl:apply-templates select="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 %> <% Set rsXML=Server.CreateObject("ADODB.RecordSet"); sSQL = “SELECT * from bbs" sConn = “你自各儿写” rsXML.CursorLocation = adUseClient rsXML.Open sSQL, sConn, adOpenStatic //指定XSL文件位置 var styleFile = Server.MapPath("simple.xsl"); // Save the XML to XMLDOM var source = Server.CreateObject("Microsoft.XMLDOM"); ''rsXML.Save source, adPersistXML ''我相称不喜欢ADO直接Save出来的XML文档,我老是如许做: Dim GetData,v GetData = GetData & "<bbs>" while not RS_ForumInfo.EOF GetData = GetData & "<post>" for i = 0 to RS_ForumInfo.Fields.Count -1 set v = 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 &">" end if set v = Nothing next GetData = GetData & "</post>" RS_ForumInfo.MoveNext wend GetData = GetData & "</bbs>" source.loadXML GetData // Load the XSL var style = 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/XSL SDK文档)来编写。(完)
以上就是运用XML完成BBS(主题列表篇)的概况引见的内容,更多相关内容请关注ki4网(www.ki4.cn)!