惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - .3S Swimmer

用类的方式实现资源国际化 CVS使用汇编 CVS使用中遇到的问题及解决办法[随记] - .3S Swimmer - 博客园 在.net 2005 环境中开发ArcMap工具条 ArcIMS开发(一)——ArcIMS API 简介 使用ArcIMS9.2+Java ADF建立基本的WebGIS站点的尝试 从已有的文件中恢复ClearCase LT Server 申请了一个gmail邮箱,体验ing C#中创建和使用资源动态链接库 C#中unhandled异常处理的问题 解决SQL Server 连接时的一些基本问题后的若干初浅心得 使用XML的DOM和XPath来创建多项选择题的在线测试 农用地定级系统工作计划 二维数据表的XML描述 ALEIS,啊,累死 我不认为我喜欢编程 用XSD判断XML文件中元素和属性 ClearCase LT的使用心得(二) ALEIS定级部分工作分配
二维数据表的显示
.3S Swimmer · 2005-06-01 · via 博客园 - .3S Swimmer

要求二维数据表显示结果如下:


项目1 项目2 项目3 项目4 项目5 合计
级别1 \ 10.47 30.58 \ 42.71 83.76
级别2 35.14 \ 59.90 \ 68.66 163.70
级别3 18.17 69.24 \ \ 78.29 165.69
级别4 33.33 32.20 91.37 \ 27.87 184.77
级别5 34.63 91.71 18.51 39.30 \ 184.14
合计 121.26 203.61 200.35 39.30 217.53 782.06

数据文件用XML存储,如下:
<?xml version="1.0" encoding="utf-16"?>
<StatResult>
  <GradeGroup Name="级别1">   
    <Item Name="项目2">10.47262</Item>
    <Item Name="项目3">30.57555</Item>   
    <Item Name="项目5">42.70821</Item>
  </GradeGroup>
  <GradeGroup Name="级别2">
    <Item Name="项目1">35.13773</Item>
    <Item Name="项目3">59.90308</Item>   
    <Item Name="项目5">68.66362</Item>
  </GradeGroup>
  <GradeGroup Name="级别3">
    <Item Name="项目1">18.16914</Item>
    <Item Name="项目2">69.23569</Item>   
    <Item Name="项目5">78.28595</Item>
  </GradeGroup> 
  <GradeGroup Name="级别5">
    <Item Name="项目1">34.62713</Item>
    <Item Name="项目2">91.70789</Item>
    <Item Name="项目3">18.50808</Item>
    <Item Name="项目4">39.30014</Item>   
  </GradeGroup>
  <GradeGroup Name="级别4">
    <Item Name="项目1">33.33007</Item>
    <Item Name="项目2">32.19778</Item>
    <Item Name="项目3">91.3653</Item>   
    <Item Name="项目5">27.8748</Item>
  </GradeGroup>
</StatResult>

用xsl 转换为html,考虑到每一个Item项实际上是由GradeGroup和Item的Name值唯一确定的,所以在输出时,需要用它们的Name共同作为 关键字。由于html是逐行输出的,所以在转换时,可以先按照Item的Name取得具有相同值的节点,然后根据它们的父节点GradeGroup的 Name确定Item输出的行顺序和列位置按照这种想法,xsl的主要代码如下:
<xsl:key name="ItemKey" match="Item" use="@Name"/>
 ...   
   <Body>
    <Table  cellspacing="1px">
     <Tr>
      <td />
      <!--显示每个唯一项目项的名称-->
      <xsl:for-each select="//Item[generate-id(.)=generate-id(key('ItemKey',@Name))]">
       <xsl:sort select="@Name"/>
       <th class="FieldCell">
        <xsl:value-of select="@Name"/>
       </th>
      </xsl:for-each>
      <th class="SumCell">合计</th>
     </Tr>
    <!--逐个处理GradeGroup节点-->
     <xsl:for-each select="GradeGroup">
      <xsl:sort select="@Name"/>
      <!--当前GradeGroup节点的Name值-->
      <xsl:variable name="curGradeName">
       <xsl:value-of select="@Name"/>
      </xsl:variable>
      <tr>
       <th class="FieldCell">
        <xsl:value-of select="@Name"/>
       </th>
       <!--挑选同名的Item节点-->
       <xsl:for-each select="//Item[generate-id(.)=generate-id(key('ItemKey',@Name)[1])]">
        <xsl:sort select="@Name"/>
        <xsl:variable name="curItemName" select="@Name"/>
        <!--从中找到属于当前GradeGroup的Item节点-->
        <xsl:variable name="lstItem" select="//Item[@Name=$curItemName and ../@Name=$curGradeName]"/>
        <!--显示Item-->
        <xsl:call-template name="ShowItem">
         <xsl:with-param name="lstItem" select="$lstItem"/>
        </xsl:call-template>
       </xsl:for-each>
       <!--按"级别"计算合计值-->
       <td class="NumCell3">
        <xsl:value-of select="format-number(sum(//Item[../@Name=$curGradeName]),'#.00')"/>
       </td>
      </tr>
     </xsl:for-each>
     <!--按"项目"计算合计值-->
     <tr>
      <th class="SumCell">合计</th>
      <xsl:for-each select="//Item[generate-id(.)=generate-id(key('ItemKey',@Name))]">
       <xsl:sort select="@Name"/>
       <xsl:variable name="curItemName" select="@Name"/>
       <td class="NumCell3">
        <xsl:value-of select="format-number(sum(//Item[@Name=$curItemName]),'#.00')"/>
       </td>
      </xsl:for-each>
      <!--总的合计值-->
      <td class="NumCell3">
       <xsl:value-of select="format-number(sum(//Item),'#.00')"/>
      </td>
     </tr>
    </Table>
   </Body>
  </Html>

 </xsl:template>
 <xsl:template name="ShowItem">
  <xsl:param name="lstItem"/>
  <xsl:if test="count($lstItem)=0">
   <td class="NumCell2">\</td>
  </xsl:if>
  <xsl:if test="count($lstItem)=1">
   <td class="NumCell1">
    <xsl:value-of select="format-number($lstItem[1],'#.00')"/>
   </td>
  </xsl:if>
 </xsl:template>