二维数据表的显示

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


项目1项目2项目3项目4项目5合计
级别1\10.4730.58\42.7183.76
级别235.14\59.90\68.66163.70
级别318.1769.24\\78.29165.69
级别433.3332.2091.37\27.87184.77
级别534.6391.7118.5139.30\184.14
合计121.26203.61200.3539.30217.53782.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>

转载于:https://www.cnblogs.com/sqwang/archive/2005/06/01/165910.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值