|
表A: 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主題列表的一個(gè)例子。一般來(lái)說(shuō),假如不是使用Oracle(Oracle 有一條查詢語(yǔ)句可以自動(dòng)生成家族樹(shù),請(qǐng)查閱Select ... startwith ... connect by ...語(yǔ)句),那么如何實(shí)現(xiàn)上例的列表是一件費(fèi)事的工作(相信許多程序員都寫(xiě)過(guò))。 如果我們改用XML來(lái)實(shí)現(xiàn),那么結(jié)果會(huì)怎么樣呢? 現(xiàn)在我們使用"Select * from bbs"從數(shù)據(jù)庫(kù)中查詢貼子,并以XML格式返回(如果你是用ADO,那么可以用其RecordSet.Save ... adPersistXML直接生成,當(dāng)然如果你不喜歡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> 說(shuō)明:這里sid是貼子的id號(hào),pid是貼子的父id號(hào)。title是標(biāo)題,content是貼子的內(nèi)容。 上表中第二行是指定使用b.XSL來(lái)轉(zhuǎn)換XML內(nèi)容。這是提供給IE5的信息。假如你使用XMLDOM,那么可以不要這條信息。 我們?cè)賮?lái)看看將上表的XML內(nèi)容顯示成表A形式的XSL文件是怎么實(shí)現(xiàn)的: 表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> 現(xiàn)在,你將表B的內(nèi)容存為abc.xml,將表C的內(nèi)容存為b.xsl,然后在IE5中打開(kāi),你就可以看到和表A一樣的內(nèi)容了。 因此可以看出,XSL文件解定了最終的顯示結(jié)果。假如你有多個(gè)子論壇,那么無(wú)需更改論壇程序,只要為各個(gè)子論壇提供不同XSL文件,就可以讓各個(gè)子論壇的版而不論風(fēng)格畫(huà)面還是主題排列都會(huì)具有獨(dú)特的表現(xiàn)。如果提供免費(fèi)論壇服務(wù),那么允許論壇申請(qǐng)者定制自已的XSL文件將是一個(gè)良好的選擇。 但是假如客戶端不支持XML,該怎么辦呢?答案很簡(jiǎn)單,由服務(wù)端先將XML轉(zhuǎn)換成HTML,再傳到客戶端。 下面我們以IIS4/5+IE5+ASP來(lái)實(shí)現(xiàn)這個(gè)例子(服務(wù)器必需安裝IE5): <%@ LANGUAGE = JScript %> <% Set rsXML=Server.CreateObject("ADODB.RecordSet"); sSQL = “SELECT * from bbs" sConn = “你自個(gè)兒寫(xiě)” 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 ''我相當(dāng)不喜歡ADO直接Save出來(lái)的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)); %> 當(dāng)然,由于此處為了簡(jiǎn)便,直接使用ADO來(lái)生成XML,因此simple.xsl和上面的b.xsl是不同的。 讀者可以參考上例和XSL參考資料(2000年的MSDN有比較詳細(xì)的XML/XSL SDK文檔)來(lái)編寫(xiě)。(完)
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!