<?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文档)来编写。

解决方案 »

  1.   

    上面的老大,我要用php实现,xml我看了有点困难。非常感谢,回给你加分的
      

  2.   

    我一般是靠库结构的设计来实现的~简单的说~~在回复文章表的字段中加一个字段: TitlePosition,顾名思义~~你应该知道我是怎么做的了~~
      

  3.   

        大哥不要太懒了,给你个思路,自己去写代码吧!
        建数据库时,每篇发言(包括回复)有一个ID ,从1开始;每篇发言有一个 FllowWith ,如果是新发帖 FllowWith 为0,若是跟贴,FllowWith 为所跟的帖子的 ID 。
        上帧显示标题时,从ID最小且 FllowWith 为0的开始,每显示一个标题就搜索有无“FllowWith”字段为本帖ID的帖子,有就把标题显示在下面,并进行同样的搜索(这里用到一个递归)。
        下帧中,form里除标题、正文外加一个隐藏字段,用来存储传递所显示帖子的ID(回复)或“0”(新发言),提交之后,把这个值赋给“FllowWith”即可。
      

  4.   

    这是一个树形结构遍历的问题,首先建立你的数据格式
    id       parend      title
    文章编号 父文章编号 文章标题然后按照这样的规律存储你的内容显示的时候这样function show($beginId)
    {
      static $level = 0;
      $sql = "select id,title from xxx where parend=$beginId";
      $result = mysql_query($sql);
      while($row = mysql_fetch_object($result))
      {
        for($i=0;$i<$level;$i++)
        {
          echo "re:";
        }
        echo $row->title;
        $sql_sub = "select count(*) from xxx where parend=$row->id";
        $row_sub = mysql_fetch_array((mysql_query($sql_sub));
        if (0 != $row_sub[0])
        {
          $level++;
          show($row->id);
        }
      }
      $level--;
    }