椅子ID:yizia
73303次访问,排名1442(-16)好友105人,关注者170
CSDN最有价值版主.

长期从事油田行业定制软件开发,擅长CA,CTI领域.正从事嵌入式开发及智能手机开发.有办公\监控\邮件\VOIP\多方通话\手机及固话运营商增值业务\卫星及雷达数据传输\气象\考试\银行代收等开发经验.
特点是:
   写材料的好手. 近几年编写十来篇硕士论文及数百期刊论文.(不用鄙视我,本人只为生活中的朋友操笔)
   系统设计的好手. 基础好,脑子活,涉猎广泛,有丰富的项目开发\产品开发\上百服务器支撑的运营\等经历.
开发工具及平台. 总有猎头问我会什么开发工具,今天一起答了:
当程序员从事过3D\PB6.5\ASP\VB6\Exchange\Sybase\MSSQL\Windows\开发;
当项目经理从事过VC6\Delphi\JSP\PHP\MYSQL\GIS\Linux\开发;
现在从事C++\VS2005\WINCE\SP\开发.

你看了也甭骂我吹牛,我追求的就是全面,只在某些方面追求深度.
[加为好友] [即时聊天] [发私信]
yizia的文章
原创 23 篇
翻译 0 篇
转载 0 篇
评论 134 篇
椅子的公告
最近评论
kittyjinhui:没明白,是压分游戏的问题?
only_endure:学习...
yizia:bug在那里摆着,迟早要解决的。
昨天忙了一天,以后就不用忙一天了。
呵呵
zdg:呵呵,蝈蝈为此忙了一天。
yizia:试验验证码
文章分类
收藏
    相册
    日报
    我的老婆孩子
    英雄大会
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 把结点按索引是奇、偶数来分列显示收藏

    新一篇: 招投标培训讲义 | 旧一篇: 内部绝密,仅供朋友们传阅

    问题提出:

        有一个XML,下面有n个结点(n>=1),用XSL将这n个结点转换到HTML的Table标记中,这个Table有两列,左边的列放入第1、3、5……个结点,右边的列放第2、4、6……个结点。

     分析:

          Table是Rows(<tr>)的集合,row是Cells(<td>)的集合,根据这个特点,企图直接按结点索引的奇偶将结点找到,然后生成列的方法是不可行的。

          应该按Rows来生成Table。

          n可能为奇数,也可能为偶数,因为n>=1 ,故Rows的总数等于n中的奇数个数。

          程序流程为,一个for-each循环,判断是否为奇数结点,判断结果为真,则新建一个row;在新建row之后,创建两个cell,第一列放入奇数结点,第二列放入该奇数结点的下一个结点。主要用到xsl:for-each和xsl:variable两个XSLT元素。

    XML代码:

     <?xml version="1.0" encoding="gb2312"?>
    <?xml-stylesheet type='text/xsl' href='3.xsl'?>
    <subject>
      <class>
        <classid>1</classid>
        <text>数据一</text>
      </class>
      <class>
        <classid>2</classid>
        <text>数据二</text>
      </class>
      <class>
        <classid>3</classid>
        <text>数据三</text>
      </class>
      <class>
        <classid>4</classid>
        <text>数据四</text>
      </class>
      <class>
        <classid>5</classid>
        <text>数据五</text>
      </class>
    </subject>

     XSL代码:

    <?xml version='1.0' encoding='gb2312'?>
    <xsl:stylesheet version="1.0"
        xmlns="http://www.w3.org/TR/REC-html40"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
     <table border ="1">
      <xsl:for-each select="//class">
      
        <xsl:if test="(position() mod 2 = 1)">
         <xsl:variable name="n" select="position()"/>
         <tr><td><xsl:value-of select="."/></td>
         <td><xsl:value-of select="//class[$n+1]" /></td></tr>
        </xsl:if>
       </xsl:for-each>
     </table>
    </xsl:template>
    </xsl:stylesheet>

    运行结果是:

    1 数据一  2 数据二 
    3 数据三  4 数据四 
    5 数据五   


    优化上面的XSL

        上面的方法检索N个结点,效率不是很高。直接用Xpath查询查到奇数结点,检索次数会减少一半。于是有了下面这个XSL:

    <?xml version='1.0' encoding='gb2312'?>
    <xsl:stylesheet version="1.0"
        xmlns="http://www.w3.org/TR/REC-html40"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
     <table border ="1">
      <xsl:apply-templates  select="//class[position() mod 2 = 1]" />
     </table>
    </xsl:template>
    <xsl:template match="//class[position() mod 2 = 1]">
      <xsl:variable name="n" select="position()"/>
      <tr><td><xsl:value-of select="."/></td>
      <td><xsl:value-of select="//class[$n+1]" /></td></tr>
    </xsl:template>
    </xsl:stylesheet>

     运行结果是:

    1 数据一  2 数据二 
    3 数据三  3 数据三 
    5 数据五  4 数据四 


        这是为什么呢?position函数将返回该结点的索引,难道不对吗?注意,索引的建立取决于该结点的父母是谁,在上文提到的两个XSL中,结点的父母分别是//class与//class[position() mod 2 = 1],所以第二个XSL没有生成预期结果。

        在第二个XSL中,该结点的possition与该结点在父母结点的索引的换算公式如下:n=2 * position() -1,那么该结点的下一个兄弟结点就是2 * position() 。我们把  <xsl:value-of select="//class[$n+1]" />修改成<xsl:value-of select="//class[$n * 2]" />,这样输出结果就正确了。

    运行结果是:


    1 数据一  2 数据二 
    3 数据三  4 数据四 
    5 数据五 

     

     


    发表于 @ 2007年04月01日 14:04:00|评论(loading...)|编辑

    新一篇: 招投标培训讲义 | 旧一篇: 内部绝密,仅供朋友们传阅

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 椅子