如果数据量不大的话,直接发给客户端,通过xsl进行排序、显示还是不错的。

解决方案 »

  1.   

    灯泡,其实是这样的,原本用数据库保存的数据不知出于什么原因(这个原因可能与我另外一贴提问的ldap有关,你参与了。)改由XML保存。我也是头次接触纯XML数据源的东西。我考虑用XPath或Xquery(xquery可能还不成熟,不过oracle的jxqi有部分实现)提取元素进行业务逻辑运算后后我就困惑了,这个计算结果我是先保存成XML,还是直接送到前台?直接送到前台的话我用不用形成一个XML的数据流?实际上计算后是给原XML增加了计算节点,并以此节点为依据进行分组。
    我说的是不是有点乱。呵呵帮忙分析分析
    另外一个问题,保存的数据其实是证券信息。那么1000多只个股信息我是分别保存还是放在一个XML文件中呢,我选择分别保存,我觉得放在一个文件里太大了。
      

  2.   

    谢谢笨小孩和红星星。红星星给我一个在客户端通过xsl进行排序的例子好么。
      

  3.   

    直接发送到客房端,XSL来进行格式显示就好了。
    1000个股票信息不多。
    呵呵,算小的了。
      

  4.   

    xuetinge(薛挺) 给个xsl排序的例子吧。谢谢你的回复
    我正在看XMLPattern.2个阿根廷人写的。等我看完和你们交流
      

  5.   

    灯泡 summoned: HP 1 (刚干完体力活), MP 1(因此没睡好觉)啊~~困……to Asprilla(dont shoot me) 1、为什么要用Oracle的东西,XML的操作最好使用Open的包。
    2、你的客户端是浏览器吗?还是自己写的小型应用(如Applet)?如果是浏览器的话建议服务器端处理,因为M$的xsl支持并不标准,也不完整,所以像CSDN这样的网站……我不说什么了。
    3、排序很简单啊:XML:
    -------------------------------------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="Books.xsl"?>
    <Books>
        <book category="reference">
            <author last="Nigel" middle="" first="Rees" />
            <title>Sayings of the Century</title>
            <price>8.95</price>
        </book>
        <book category="fiction">
            <author last="Evelyn" middle="" first="Waugh" />
    <title>Sword of Honour</title>
    <price>12.99</price>
        </book>
        <book category="children's book">
            <author last="Rowling" middle="K." first="J." />
            <title>Harry Potter and the Sorcerer's Stone</title>
            <price>15.96</price>
        </book>
        <book category="children's book">
            <author last="Williams" middle="Aurelia" first="Lori" />
    <title>When Kambia Elaine Flew in from Neptune</title>
    <price>13.60</price>
        </book>
        <book category="children's book">
            <author last="Pullman" middle="" first="Philip" />
    <title>The Amber Spyglass (His Dark Materials, No 3)</title>
    <price>15.96</price>
        </book>
        <book category="fiction">
            <author last="Herman" middle="" first="Melville" />
            <title>Moby Dick</title>
            <price>8.99</price>
        </book>
        <book category="fiction">
            <author last="Grisham"  middle=""  first="John" />
            <title>A Painted House</title>
            <price>16.77</price>
        </book>
        <book category="fiction">
            <author last="Binchy"  middle=""  first="Maeve" />
            <title>Scarlet Feather</title>
            <price>20.76</price>
        </book>
        <book category="fiction">
            <author last="J." middle="R. R." first="Tolkien" />
            <title>The Lord of the Rings</title>
            <price>22.99</price>
        </book>
    </Books>XSL:
    -------------------------------------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0"
        xmlns:xalan="http://xml.apache.org/xslt">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" xalan:indent-amount="2"/>
    <xsl:strip-space elements="*"/>
      <xsl:template match="/">
        <xsl:call-template name="html"/>
      </xsl:template>
      <xsl:template name="body">
        <body>
          <h1>
            <xsl:value-of select="'A list of books to be displayed in a web browser via html'"/>
          </h1>
          <xsl:call-template name="table"/>
        </body>
      </xsl:template>
      <xsl:template name="head">
        <head>
          <title>
            <xsl:value-of select="'title'"/>
          </title>
        </head>
      </xsl:template>
      <xsl:template name="html">
        <html>
          <xsl:call-template name="head"/>
          <xsl:call-template name="body"/>
        </html>
      </xsl:template>
      <xsl:template name="table">
        <table>
          <xsl:attribute name="border">
            <xsl:value-of select="'2'"/>
          </xsl:attribute>
          <xsl:apply-templates select="/Books/book">
            <xsl:sort select="@category"
                order="ascending"
                case-order="upper-first"
                data-type="text"/>
            <xsl:sort select="price/text()"
                order="ascending"
                case-order="upper-first"
                data-type="number"/>
          </xsl:apply-templates>
        </table>
      </xsl:template>
      <xsl:template match="book">
        <tr>
          <td>
            <xsl:value-of select="concat(author/@first, ' ', author/@last)"/>
          </td>
          <td>
            <xsl:value-of select="title/text()"/>
          </td>
          <td>
            <xsl:value-of select="@category"/>
          </td>
          <td>
            <xsl:value-of select="price/text()"/>
          </td>
        </tr>
      </xsl:template>
      <xsl:template match="*|@*|comment()|processing-instruction()|text()">
        <xsl:copy>
          <xsl:apply-templates select="*|@*|comment()|processing-instruction()|text()"/>
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
      

  6.   

    灯泡我问个问题,你的意思是说定义好一个XML和XSLT以后还要用诸如XALAN\xerces来解析生成HTML?那么这时候排序功能是在客户端进行的还是服务器端?
      

  7.   

    其实应该字检索数据那部分生成,你在检索数据的时候,按降序或升序检索数据,然后生成XML文件,这样生成的XML文件就是按一定顺序排序的。至于在客户端还是服务器端,要看你的程序要求了。
      

  8.   

    你可以去XML论坛查找一下有关基于XML使用XSLT进行分页显示的帖子,有一个4星还是5星的高人写了一个基于客户端分页显示的例子(他用的vbscript,其中包括排序)。我前两天照着他的例子也大概写了一个(我用的javascript,就是还没写排序那部分)。
    不难的。
      

  9.   

    看来Asprilla你的客户端是IE。我的建议同disk,因为你直接把整个XML发给客户端实在是毫无意义的。我的建议就是瘦客户端,服务器压力大一些没什么,可以升级硬件……不过不管怎么说,其实决定这件事情的是应用需求,你有没有估计过你的用户并发,查询规模等服务器负载的数据?根据这些数据再考虑你应该使用什么方法。to redstarstar(红星星) javascript的代码能贴上来一份吗?
      

  10.   

    to disk
    是这样一个报表需要俺每个栏目排序,那么他每次排序都要通过服务器端就有些过分了。第一次生成数据时我会按默认排序栏目排序的。to 灯泡
    我这个需求不是很明确,我想减轻服务器压力,因为终端用户会很多。并发现象肯定会有。to 红星星
    谢谢
      

  11.   

    对了,灯泡。现在csdn这个论坛用的什么模式?XML+XSLT+JAVA??
      

  12.   

    这个CSDN论坛的流程是什么样的?
    用户提交信息,服务端加入信息到XML文件,之后通过XSLT显示给用户么?
      

  13.   

    paging.xsl<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="http://www.risesoft.net">
    <msxsl:script language="javascript" implements-prefix="user"><![CDATA[ 
           function getName(node) {
               elementName = node.item(0).nodeName;
               return elementName;
           }  
       ]]></msxsl:script>
    <xsl:param name="totalPageNumber" select="1"/>
    <xsl:param name="recordsPerPage" select="5"/>
    <xsl:param name="totalRecords" select="1"/>
    <xsl:param name="currentPageNumber" select="1"/>
    <xsl:param name="beginPage" select="1"/>
    <xsl:param name="endPage" select="1"/>
    <xsl:variable name="from" select="$recordsPerPage * ($currentPageNumber - 1) + 1"/>
    <xsl:variable name="to">
    <xsl:choose>
    <xsl:when test="$totalPageNumber = $currentPageNumber">
    <xsl:value-of select="$totalRecords"/>
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="$recordsPerPage*$currentPageNumber"/>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:variable>
    <xsl:template match="/">
    <table width="90%" cellpadding="0" cellspacing="1" border="0" style="font-size:12px" bgcolor="#9A9792">
    <tr bgcolor="#E7E7E7" style="cursor: hand;padding:2px;font-size:13px;font-weight: bold;" align="center">
    <xsl:for-each select="/*/*[1]/*">
    <td>
    <div onclick="sortField(&quot;{user:getName(.)}&quot;)"><xsl:value-of select="user:getName(.)"/></div>
    </td>
    </xsl:for-each>
    </tr>
    <xsl:for-each select="/*/*[position() &#62;= $from and position() &#60;= $to]">
    <xsl:sort select="*[1]" order="ascending" data-type="number"/>
    <tr bgcolor="#FFFFFF" align="center" style="padding:2px">
    <xsl:for-each select="*">
    <td>
    <xsl:value-of select="."/>
    </td>
    </xsl:for-each>
    </tr>
    </xsl:for-each>
    </table>
    <xsl:call-template name="pageNavigator">
    <xsl:with-param name="totalPageNumber" select="$totalPageNumber"/>
    <xsl:with-param name="totalRecords" select="$totalRecords"/>
    <xsl:with-param name="currentPageNumber" select="$currentPageNumber"/>
    <xsl:with-param name="recordsPerPage" select="$recordsPerPage"/>
    <xsl:with-param name="beginPage" select="$beginPage"/>
    <xsl:with-param name="endPage" select="$endPage"/>
    </xsl:call-template>
    </xsl:template>
    <xsl:template name="pageNavigator">
    <xsl:param name="totalPageNumber"/>
    <xsl:param name="totalRecords"/>
    <xsl:param name="recordsPerPage"/>
    <xsl:param name="currentPageNumber"/>
    <xsl:param name="beginPage"/>
    <xsl:param name="endPage"/>
    <table width="90%" cellpadding="0" cellspacing="0" border="0" style="border:1px black none;font-size:12px" bgcolor="#E3E3E3">
    <tr style="padding:2px">
    <td align="center">
     绗?#160;<xsl:value-of select="$from"/>&#160;鏉?#160;鍒?
       绗?#160;<xsl:value-of select="$to"/>&#160;鏉?#160;&#160;
     绗?#160;<xsl:value-of select="$currentPageNumber"/>&#160;椤?
     &#160;&#160;鎬?#160;<xsl:value-of select="$totalPageNumber"/>&#160;椤?
     &#160;&#160;鍏?#160;<xsl:value-of select="$totalRecords"/>&#160;鏉¤褰?
    </td>
    <td align="right">
    <xsl:if test="$currentPageNumber &#62;10">
    <a href="javascript:jumptoPage({$beginPage - 1})">&lt;&lt;</a>&#160;
    </xsl:if>
    <xsl:call-template name="printPages">
    <xsl:with-param name="beginPage" select="$beginPage"/>
    <xsl:with-param name="endPage" select="$endPage"/>
    <xsl:with-param name="currentPageNumber" select="$currentPageNumber"/>
    <xsl:with-param name="totalPageNumber" select="$totalPageNumber"/>
    </xsl:call-template>
    </td>
    </tr>
    </table>
    </xsl:template>
    <xsl:template name="printPages">
    <xsl:param name="beginPage"/>
    <xsl:param name="endPage"/>
    <xsl:param name="currentPageNumber"/>
    <xsl:param name="totalPageNumber"/>
    <xsl:if test="$totalPageNumber &#62; 1">
    <xsl:if test="$beginPage &#60;= $endPage">
    <xsl:choose>
    <xsl:when test="$beginPage = $currentPageNumber">
    <xsl:value-of select="$beginPage"/>&#160;
    </xsl:when>
    <xsl:otherwise>
    <a href="javascript:jumptoPage({$beginPage})">
    <xsl:value-of select="$beginPage"/>
    </a>&#160;
    </xsl:otherwise>
    </xsl:choose>
    <xsl:if test="$beginPage = $endPage and $beginPage != $totalPageNumber">
    <a href="javascript:jumptoPage({$endPage + 1})">&gt;&gt;</a>
    </xsl:if>
    <xsl:call-template name="printPages">
    <xsl:with-param name="beginPage" select="$beginPage + 1"/>
    <xsl:with-param name="endPage" select="$endPage"/>
    <xsl:with-param name="currentPageNumber" select="$currentPageNumber"/>
    <xsl:with-param name="totalPageNumber" select="$totalPageNumber"/>
    </xsl:call-template>
    </xsl:if>
    </xsl:if>
    </xsl:template>
    </xsl:stylesheet>
      

  14.   

    XMLPaging.html<html>
    <head>
    <title>XML、XSLT分页(基于客户端)</title>
    <script language="javascript">
    var dataXml;
    var pagingXsl;

    var xslt;
    var xslDoc
    var xslProc;

    var recordsPerPage = 5; //每页显示的纪录的行数
    var currentPageNumber = 1; //当前显示的页码

    function window.onload(){

    dataXml = new ActiveXObject("Microsoft.XMLDOM");
       dataXml.async = false;
       dataXml.load("data.xml");

    xslt = new ActiveXObject("Msxml2.XSLTemplate");
    xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");

    xslDoc.async = false;
    xslDoc.resolveExternals = false;
    xslDoc.load("paging.xsl"); xslt.stylesheet = xslDoc;
    xslProc = xslt.createProcessor();
    xslProc.input = dataXml;

       this.initPagingNavigator();
      
    xslProc.transform();
       pagingDiv.innerHTML = xslProc.output;
      
      
      
    }
    function initPagingNavigator() {
    var totalRecords = dataXml.selectNodes("/*/*").length;
    var totalPageNumber = totalRecords/recordsPerPage;

    if(totalPageNumber.toString().indexOf(".") == -1)  {
    if(totalPageNumber== 0) {
    totalPageNumber= 1;
    }
    }
    else {
    totalPageNumber= new Number(totalPageNumber.toString().substring(0,totalPageNumber.toString().indexOf("."))) + 1;
    }


    var temp = currentPageNumber/10+0.4;
    var beginPage = Math.round(temp)*10-(10-1);
    var endPage = Math.round(temp)*10;
    if(endPage > totalPageNumber) {
    endPage = totalPageNumber;
    } //alert(beginPage+"--"+endPage);
    //alert("totalPageNumber:"+totalPageNumber);
    //alert("totalRecords:"+totalRecords); xslProc.addParameter("totalRecords", totalRecords);
    xslProc.addParameter("totalPageNumber", totalPageNumber);
    xslProc.addParameter("recordsPerPage", recordsPerPage);
    xslProc.addParameter("currentPageNumber", currentPageNumber);
    xslProc.addParameter("beginPage", beginPage);
    xslProc.addParameter("endPage", endPage);
    }

    function jumptoPage(pageNumber) {
    setCurrentPageNumber(pageNumber);
    initPagingNavigator();
    xslProc.transform();
       pagingDiv.innerHTML = xslProc.output; } function sortField(fieldName){
    var sortNode = xslDoc.selectSingleNode("//xsl:sort/@select");
    var sortNodeAttr = xslDoc.selectSingleNode("//xsl:sort/@order");
    /*
    if(sortNodeAttr.value == "ascending") {
    alert("1")
    sortNodeAttr.value = "descending";
    }
    else {
    sortNodeAttr.value = "ascending";
    }
    sortNode.value = "/" + fieldName;

    xslt.stylesheet = xslDoc;
    xslProc = xslt.createProcessor();
    xslProc.input = dataXml;

       this.initPagingNavigator();
      
    xslProc.transform();
       pagingDiv.innerHTML = xslProc.output;
    */
    //alert(fieldName);
    //alert(xslDoc.selectSingleNode("//xsl:sort/@select").value);
    } function setRecordsPerPage(recordsPerPage) {
    this.recordsPerPage = recordsPerPage
    } function setCurrentPageNumber(currentPageNumber) {
    this.currentPageNumber = currentPageNumber;
    }
    </script>
    <link rel="stylesheet" type="text/css" href="paging.css">
    </head>
    <body>
    <div align="center">
    <div id="pagingDiv">
    </div>
    </div>
    </body>
    </html>
      

  15.   

    data.xml<?xml version="1.0" encoding="gb2312"?>
    <list-set>
    <list>
    <ID>1</ID>
    <用户名>张三</用户名>
    <IP>192.168.0.1</IP>
    <日期>2002-12-11 5:16:28</日期>
    <电子邮件>test</电子邮件>
    <备注>why not me?</备注>
    </list>
    <list>
    <ID>2</ID>
    <用户名>李四</用户名>
    <IP>192.168.0.2</IP>
    <日期>2002-12-11 22:24:16</日期>
    <电子邮件>test</电子邮件>
    <备注>test</备注>
    </list>
    <list>
    <ID>3</ID>
    <用户名>王五</用户名>
    <IP>192.168.0.3</IP>
    <日期>2002-12-12 23:24:37</日期>
    <电子邮件>[email protected]</电子邮件>
    <备注>blood is red</备注>
    </list>
    <list>
    <ID>4</ID>
    <用户名>郭六</用户名>
    <IP>192.168.0.4</IP>
    <日期>2002-12-12 23:25:58</日期>
    <电子邮件>fffffffff</电子邮件>
    <备注>ffffffffffff</备注>
    </list>
    <list>
    <ID>5</ID>
    <用户名>李鸿</用户名>
    <IP>192.168.0.5</IP>
    <日期>2002-12-11 5:16:28</日期>
    <电子邮件>test</电子邮件>
    <备注>test</备注>
    </list>
    <list>
    <ID>6</ID>
    <用户名>苏素奎</用户名>
    <IP>192.168.0.6</IP>
    <日期>2002-12-11 22:24:16</日期>
    <电子邮件>test</电子邮件>
    <备注>test</备注>
    </list>
    <list>
    <ID>7</ID>
    <用户名>欧库歌</用户名>
    <IP>192.168.0.7</IP>
    <日期>2002-12-12 23:24:37</日期>
    <电子邮件>[email protected]</电子邮件>
    <备注>blood is red</备注>
    </list>
    <list>
    <ID>8</ID>
    <用户名>彗尔图</用户名>
    <IP>192.168.0.8</IP>
    <日期>2002-12-12 23:25:58</日期>
    <电子邮件>fffffffff</电子邮件>
    <备注>ffffffffffff</备注>
    </list>
    <list>
    <ID>9</ID>
    <用户名>苟流动</用户名>
    <IP>192.168.0.9</IP>
    <日期>2002-12-11 5:16:28</日期>
    <电子邮件>test</电子邮件>
    <备注>test</备注>
    </list>
    <list>
    <ID>10</ID>
    <用户名>郑流股</用户名>
    <IP>192.168.0.10</IP>
    <日期>2002-12-11 22:24:16</日期>
    <电子邮件>test</电子邮件>
    <备注>test</备注>
    </list>
    <list>
    <ID>11</ID>
    <用户名>Jack</用户名>
    <IP>192.168.0.11</IP>
    <日期>2002-12-12 23:24:37</日期>
    <电子邮件>[email protected]</电子邮件>
    <备注>blood is red</备注>
    </list>
    <list>
    <ID>12</ID>
    <用户名>Mike</用户名>
    <IP>192.168.0.12</IP>
    <日期>2002-12-12 23:25:58</日期>
    <电子邮件>fffffffff</电子邮件>
    <备注>ffffffffffff</备注>
    </list>
    </list-set>
      

  16.   

    哦,原来是习惯看一堆代码啊?上面有位提到不要使用MS的方法排序,
    但可以使用JS客户端进行排序,(上面好像已经给出例子)
    也可以使用xalan服务器端排序。用法到这去看
    http://xml.apache.org/xalan-j/index.html
      

  17.   

    来人说说csdn'forum的数据流程。
      

  18.   

    csdn'forum的垃圾流程:入库流程:
    进入数据库->生成XML->Over。
                ^^^^^^^这一步竟然是由用户触发的,如果正好用户没完做就……404了!
    检索获取流程:
    通过ID直接将用户转送到XML文件。
          ^^^^也不先看看这个文件是不是存在??!!删除流程
    先删数据库记录->有时好像不删文件。
    ^^^^^^^^^^^^^^怎么想都应该后删记录的!
      

  19.   

    同一数据既保存在db又保存在XML么?还是db里只保存一个xml的指向?