新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> XML与各种文件格式的相互转换及相关工具。 word to xml, xml to word, html to xml, xml to pdf,
    csv to xml, rtf to xml, text to xml, xml to text, xls to xml, xml to xls
    FOP
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 WORD to XML, HTML to XML 』 → xml 分组问题[求助] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 68949 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: xml 分组问题[求助] 举报  打印  推荐  IE收藏夹 
       本主题类别: 样式表技术(XSL, XSLT, XSL-FO, CSS)    
     hugh151721 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:22
      积分:130
      门派:XML.ORG.CN
      注册:2008/12/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hugh151721发送一个短消息 把hugh151721加入好友 查看hugh151721的个人资料 搜索hugh151721在『 WORD to XML, HTML to XML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hugh151721的博客11
    发贴心情 

    这是我的XSL:
    <?xml version="1.0" encoding="utf-8" ?>
    - <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
      <xsl:key name="groupno" match="group" use="group_no" />
      <xsl:variable name="groupby1" select="group[generate-id(.)=generate-id(key('groupno',group_no))]" />
      <xsl:key name="group-by-emp" match="groupby1" use="emp_no" />
    - <xsl:template match="NewDataSet">
    - <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/tr/rec-html40">
    - <Worksheet ss:Name="mypage">
    - <Table border="1">
    - <tr>
      <td>事业组编号</td>
      <td>员工代号</td>
      <td>事业组名称</td>
      <td>员工名称</td>
      <td>费用</td>
      </tr>
    - <xsl:for-each select="$groupby1">
    - <xsl:for-each select="group[generate-id(.)=generate-id(key('group-by-emp',emp_no))]">
    - <xsl:for-each select="key('group-by-emp',emp_no)">
    - <tr>
    - <td>
      <xsl:value-of select="group_no" />
      </td>
    - <td>
      <xsl:value-of select="emp_no" />
      </td>
    - <td>
      <xsl:value-of select="group_name" />
      </td>
    - <td>
      <xsl:value-of select="emp_name" />
      </td>
    - <td>
      <xsl:value-of select="amt" />
      </td>
      </tr>
      </xsl:for-each>
      </xsl:for-each>
      </xsl:for-each>
    - <tr>
      <td>合计</td>
      <td />
      <td />
      <td />
    - <td>
      <xsl:value-of select="sum(//group/amt)" />
      </td>
      </tr>
      </Table>
      </Worksheet>
      </Workbook>
      </xsl:template>
      </xsl:stylesheet>
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/1/11 21:56:00
     
     hugh151721 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:22
      积分:130
      门派:XML.ORG.CN
      注册:2008/12/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hugh151721发送一个短消息 把hugh151721加入好友 查看hugh151721的个人资料 搜索hugh151721在『 WORD to XML, HTML to XML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hugh151721的博客12
    发贴心情 
    我刚刚修改了我的xsl,如下:
    <?xml version="1.0" encoding="utf-8"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
      <xsl:key   name="groupno"   match="group"   use="group_no"   />
      <xsl:key   name="empno"   match="group"   use="emp_no"   />
      <xsl:template match="NewDataSet">
          <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/tr/rec-html40">
            <Worksheet ss:Name="mypage">
              <Table border="1" >
                <tr>
                  <td>事业组编号</td>
                  <td>员工代号</td>
                  <td >事业组名称</td>
                  <td>员工名称</td>
                  <td>费用</td>
                </tr>
                <xsl:for-each select="group[generate-id(.)=generate-id(key('groupno',group_no))]">
          <xsl:variable name="samegroup_no" select="key('groupno',group_no)" />
          <xsl:for-each select="$samegroup_no[not(emp_no=preceding-sibling::samegroup_no/emp_no)]">
         <xsl:variable name="sameemp_no" select="key('empno',emp_no)" />
          <xsl:for-each select ="$sameemp_no">
           <xsl:if test="$samegroup_no/group_no=group_no">
            <tr>
           <td>
            <xsl:value-of select="group_no"/>
           </td>
           <td>
            <xsl:value-of select="emp_no"/>
           </td>
            <td>
           <xsl:value-of select="group_name"/>
            </td>
            <td>
           <xsl:value-of select="emp_name"/>
            </td>
            <td>
           <xsl:value-of select="amt"/>
            </td>
          </tr>
          </xsl:if>
         </xsl:for-each>
         
         <tr>
          <th>ss</th>
         </tr>
         </xsl:for-each>
         <tr>
          <th>cc</th>
         </tr>
                </xsl:for-each>
                <tr>
                  <td>合计</td>
                  <td/>
                  <td/>
                  <td/>
                  <td>
                      <xsl:value-of select="sum(//group/amt)"/>
                  </td>
                </tr>
              </Table>
            </Worksheet>
          </Workbook>
      </xsl:template>
    </xsl:stylesheet>
    但得到的结果却不符合我的要求,结果为:

    事业组编号 员工代号 事业组名称 员工名称 费用
    1 00067 新光 张 57.0000
    1 00067 新光 张 48.0000
    1 00067 新光 张 22.0000
    ss
    1 00064 新光 刘 15.0000
    ss
    1 00067 新光 张 57.0000
    1 00067 新光 张 48.0000
    1 00067 新光 张 22.0000
    ss
    1 00067 新光 张 57.0000
    1 00067 新光 张 48.0000
    1 00067 新光 张 22.0000
    ss
    cc
    2 00067 华春 张 12.0000
    2 00067 华春 张 24.0000
    ss
    2 00064 华春 刘 25.0000
    ss
    2 00068 华春 马 23.0000
    ss
    2 00067 华春 张 12.0000
    2 00067 华春 张 24.0000
    ss
    cc
    合计    226
    请问 “$samegroup_no[not(emp_no=preceding-sibling::samegroup_no/emp_no)] ”这句代码不是判断samegroup_no中的emp_no是不是第一次出现吗?

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/1/12 9:32:00
     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 WORD to XML, HTML to XML 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客13
    发贴心情 
    随便写了一个eg,估计不能满足你的要求,但看你的几个xsl:for-each+key()嵌套偶就晕。
    key()非常占用资源,如果XML信息量大的话,可能导致堆桟溢出。偶下面的代码只用一个key,外加一个sort已经够呛了。建议改写代码。

    <?xml version="1.0" encoding="utf-8"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
      <xsl:key   name="groupno"   match="group"   use="group_no"   />
      <xsl:template match="NewDataSet">
          <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/tr/rec-html40">
            <Worksheet ss:Name="mypage">
              <Table border="1" >
                <tr>
                  <td>事业组编号</td>
                  <td>员工代号</td>
                  <td >事业组名称</td>
                  <td>员工名称</td>
                  <td>费用</td>
                </tr>
                <xsl:for-each select="group[generate-id(.)=generate-id(key('groupno',group_no))]">
    <xsl:variable name="samegroup_no" select="group_no"/>
                <xsl:for-each select="key('groupno',group_no)">
      <xsl:sort select="emp_no"/>
    <xsl:if test="$samegroup_no=group_no">

            <tr>
           <td>
            <xsl:value-of select="group_no"/>
           </td>
           <td>
            <xsl:value-of select="emp_no"/>
           </td>
            <td>
           <xsl:value-of select="group_name"/>
            </td>
            <td>
           <xsl:value-of select="emp_name"/>
            </td>
            <td>
           <xsl:value-of select="amt"/>
            </td>
          </tr>
    </xsl:if>

                </xsl:for-each>
    <tr><td>aaa</td></tr>
                </xsl:for-each>


                <tr>
                  <td>合计</td>
                  <td/>
                  <td/>
                  <td/>
                  <td>
                      <xsl:value-of select="sum(//group/amt)"/>
                  </td>
                </tr>
              </Table>
            </Worksheet>
          </Workbook>
      </xsl:template>
    </xsl:stylesheet>

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/1/13 15:30:00
     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 WORD to XML, HTML to XML 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客14
    发贴心情 
    给你个思路吧:
    遍历所有节点,同时通过count()来统计与分组相关的节点,根据统计结果决定遍历与当前节点相关的节点,current()的用法比较关键。这种用法没有用到key和sort,特别是count()统计结果还可以大大减少循环的次数。

    这是偶回忆9楼提过的源码所能给出的思路,不是很全面。

    当然,模板递归+current() or key()、current()+key()的用法也不错,关键在算法,最好不要出现多个key(),sort(),多个current() (最好不超过两个)嵌套也不好。

    这是偶当时测试相关代码的结论,一家之言,仅供参考。

    因为最近在写些代码,没有太多时间来考虑和测试代码。

    开动你的脑筋吧,XPath是关键。

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/1/13 16:08:00
     
     hugh151721 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:22
      积分:130
      门派:XML.ORG.CN
      注册:2008/12/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hugh151721发送一个短消息 把hugh151721加入好友 查看hugh151721的个人资料 搜索hugh151721在『 WORD to XML, HTML to XML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hugh151721的博客15
    发贴心情 
    感谢Qr,后来我又稍微变换了下方式,分组的目的是达到了,主要代码如下:
    ---------------------------------------------------------------------------------------------------------
    <xsl:key   name="groupno"   match="group"   use="group_no"   />
    <xsl:key   name="empno"   match="group"   use="emp_no"   />

    <xsl:for-each select="./group[generate-id(.)=generate-id(key('groupno',group_no))]"> 
    <xsl:variable name="vargroup_no" select="group_no" /> 
    <xsl:for-each select="../group[generate-id(.)=generate-id(key('empno',emp_no))]">       
    <xsl:variable name="varemp_no" select="emp_no"/>     
    <xsl:for-each select="../group[group_no=$vargroup_no and emp_no=$varemp_no]">
    </xsl:for-each>
    </xsl:for-each>
    </xsl:for-each>
    ------------------------------------------------------------
    不过我发现用这个方法,但数据量大时,效率就会很慢,我一个8M的XML文件,大概需要花2分钟。今天看了你的回复,回去再考虑考虑。再次感谢Qr斑大。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/1/13 19:21:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 WORD to XML, HTML to XML 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/29 3:22:34

    本主题贴数15,分页: [1] [2]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    86.914ms