Implement BBS using XML (list article)

zhaozj2021-02-17  89

Mu Feng (first draft)

Table 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

The above is an example of the BBS topic list. In general, if not using Oracle (Oracle has a query statement can automatically generate family trees, please consult the Select ... Start With ... Connect By ... statement), how to implement the list of the above example is a cost Work (I believe that many programmers have written).

If we do this to XML, what is the result?

Now we use "Select * from bbs" to query the post from the database, and return in XML format (if you use ADO, you can generate directly with its recordset.save ... AdpersistXML, of course, if you don't like ADO generated Format, available programs, such as this example):

Table B: 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></p> <p>Description: Here SID is the ID number of the post, PID is the parent ID of the post. Title is the title, Content is the content of the post. The second line in the above table is to specify use B.xsl to convert XML content. This is information provided to IE5. If you use xmldom, you may not be this information. Let's take a look at how to display the XML content of the table as a form of XSL files. //www.w3.org/tr/wd-xsl> <xsl: template match = "/"> <html> <body> <xsl: apply-templates select = "*" /> </ body> </ HTML> </ XSL: Template></p> <p><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></p> <p><XSL: Template Match = "BBS"> <ul> <xsl: Apply-Templates Select = "POST [@ PID = 0]" /> </ ul> </ xsl: template> </ xsl: stylesheet></p> <p>Now, you save the contents of Table B as ABC.XML, save the contents of Table C as B.XSL, and then open in IE5, you can see the same content as Table A.</p> <p>It can therefore be seen that the XSL file solves the final display result. If you have multiple sub-forums, then there is no need to change the forum program, as long as you provide different XSL files for each sub-forum, you can make the version of each sub-forum regardless of the style screen or the topic arrangement will have a unique performance. If you provide a free forum service, then allow forum applicants to customize the XSL files will be a good choice. But if the client does not support XML, what should I do? The answer is simple, and the service is first converted to HTML first, and then it to the client.</p> <p>Below we implement this example with IIS4 / 5 IE5 ASP (the server must install IE5):</p> <p><% @ Language = JScript%> <% set = server.createObject ("adoDb.recordset"); ssql = "SELECT * FROM BBS" sconn = "You write" rsxml.cursorLocation = aduseclient rsxml.open ssql, Sconn, AdopenStatic / / Specifies the XSL file location var stylefile = server.mappath ("simple.xsl"); // save the xml to xmldom var source = server.createObject ("Microsoft.xmLDom"); 'Rsxml.save Source, Adpersistxml 'I quite don't like the XML document that ADO directly save, I always do this:</p> <p>Dim getData, v getdata = getdata & "<bbs>" while not = getData & "<post>" for i = 0 to rs_forumfo.fields.count -1 set v = = r rfo.fields.Item (i) IF (v.type = 201) or (v.type = 203) The GetData = getData & "<" & r_forumfo.fields.item (i) .name & "& _" <! [CDATA ["& rs_forumfo.fields.Item (i) .Value &"]]> "& _" </ "& iS_forumfo.fields.Item (i) .Name &" Else getData = getData & "<" & rs_forumfo .Fields.Item (i) .name & ">" rs_forumfo.fields.Item (i) .Value & _ </ "& rs_forumfo.fields.item (i) .name &" end if set v = Nothing Next getData = getData & "</ post>" rs_forumfo.movenext wend getData = getData & "</ bbs>"</p> <p>Source.loadXML GetData</p> <p>// load the xsl var style = server.createObject ("Microsoft.xmLDom"); style.async = false; style.load (stylefile);</p> <p>Response.write (Source.TransformNode (Style);%> Of course, since the ADO is used directly, the XML is generated directly, so the simple.xsl and the above B.XSL are different. Readers can refer to the above example and XSL reference (2000 MSDN has a more detailed XML / XSL SDK document).</p></div><div class="text-center mt-3 text-grey"> 转载请注明原文地址:https://www.9cbs.com/read-31338.html</div><div class="plugin d-flex justify-content-center mt-3"></div><hr><div class="row"><div class="col-lg-12 text-muted mt-2"><i class="icon-tags mr-2"></i><span class="badge border border-secondary mr-2"><h2 class="h6 mb-0 small"><a class="text-secondary" href="tag-2.html">9cbs</a></h2></span></div></div></div></div><div class="card card-postlist border-white shadow"><div class="card-body"><div class="card-title"><div class="d-flex justify-content-between"><div><b>New Post</b>(<span class="posts">0</span>) </div><div></div></div></div><ul class="postlist list-unstyled"> </ul></div></div><div class="d-none threadlist"><input type="checkbox" name="modtid" value="31338" checked /></div></div></div></div></div><footer class="text-muted small bg-dark py-4 mt-3" id="footer"><div class="container"><div class="row"><div class="col">CopyRight © 2020 All Rights Reserved </div><div class="col text-right">Processed: <b>0.050</b>, SQL: <b>9</b></div></div></div></footer><script src="./lang/en-us/lang.js?2.2.0"></script><script src="view/js/jquery.min.js?2.2.0"></script><script src="view/js/popper.min.js?2.2.0"></script><script src="view/js/bootstrap.min.js?2.2.0"></script><script src="view/js/xiuno.js?2.2.0"></script><script src="view/js/bootstrap-plugin.js?2.2.0"></script><script src="view/js/async.min.js?2.2.0"></script><script src="view/js/form.js?2.2.0"></script><script> var debug = DEBUG = 0; var url_rewrite_on = 1; var url_path = './'; var forumarr = {"1":"Tech"}; var fid = 1; var uid = 0; var gid = 0; xn.options.water_image_url = 'view/img/water-small.png'; </script><script src="view/js/wellcms.js?2.2.0"></script><a class="scroll-to-top rounded" href="javascript:void(0);"><i class="icon-angle-up"></i></a><a class="scroll-to-bottom rounded" href="javascript:void(0);" style="display: inline;"><i class="icon-angle-down"></i></a></body></html><script> var forum_url = 'list-1.html'; var safe_token = 'pxdp2enL0KUotTskYG7YFy45vRPTzflulHtYWFfcRYFeOuBYI3kGvMiZhbjjyvMDvnxOqtI3wFmpP0vlYobXgw_3D_3D'; var body = $('body'); body.on('submit', '#form', function() { var jthis = $(this); var jsubmit = jthis.find('#submit'); jthis.reset(); jsubmit.button('loading'); var postdata = jthis.serializeObject(); $.xpost(jthis.attr('action'), postdata, function(code, message) { if(code == 0) { location.reload(); } else { $.alert(message); jsubmit.button('reset'); } }); return false; }); function resize_image() { var jmessagelist = $('div.message'); var first_width = jmessagelist.width(); jmessagelist.each(function() { var jdiv = $(this); var maxwidth = jdiv.attr('isfirst') ? first_width : jdiv.width(); var jmessage_width = Math.min(jdiv.width(), maxwidth); jdiv.find('img, embed, iframe, video').each(function() { var jimg = $(this); var img_width = this.org_width; var img_height = this.org_height; if(!img_width) { var img_width = jimg.attr('width'); var img_height = jimg.attr('height'); this.org_width = img_width; this.org_height = img_height; } if(img_width > jmessage_width) { if(this.tagName == 'IMG') { jimg.width(jmessage_width); jimg.css('height', 'auto'); jimg.css('cursor', 'pointer'); jimg.on('click', function() { }); } else { jimg.width(jmessage_width); var height = (img_height / img_width) * jimg.width(); jimg.height(height); } } }); }); } function resize_table() { $('div.message').each(function() { var jdiv = $(this); jdiv.find('table').addClass('table').wrap('<div class="table-responsive"></div>'); }); } $(function() { resize_image(); resize_table(); $(window).on('resize', resize_image); }); var jmessage = $('#message'); jmessage.on('focus', function() {if(jmessage.t) { clearTimeout(jmessage.t); jmessage.t = null; } jmessage.css('height', '6rem'); }); jmessage.on('blur', function() {jmessage.t = setTimeout(function() { jmessage.css('height', '2.5rem');}, 1000); }); $('#nav li[data-active="fid-1"]').addClass('active'); </script>