【问题标题】:Add the Numeric column values and inserting total in XSLT在 XSLT 中添加数值列值并插入总计
【发布时间】:2012-04-11 05:44:23
【问题描述】:

我正在编写一个 XSLT 脚本,它会生成如下所示的 HTML 输出:

Alice           0
Bob    Maths    74
       Science  84
Mary   Maths    80
       Science  90
       History  95
Mark   Maths    70
Tim             0

我想为每个学生添加一个总单元格,表格应该像

Alice  Total    0
Bob    Maths    74
       Science  84
       Total    158
Mary   Maths    80
       Science  90
       History  95
       Total    265
Mark   Maths    70
       Total    70
Tim    Total    0



<currentRow>
  <columnValue>alice</columnValue>
  <columnValue><null/></columnValue>
  <columnValue>0</columnValue>
</currentRow>
<currentRow>
  <columnValue>bob</columnValue>
  <columnValue>maths</columnValue>
  <columnValue>74</columnValue>
</currentRow>
<currentRow>
  <columnValue>bob</columnValue>
  <columnValue>science</columnValue>
  <columnValue>84</columnValue>
</currentRow>
<currentRow>
  <columnValue>mary</columnValue>
  <columnValue>maths</columnValue>
  <columnValue>80</columnValue>
</currentRow>
<currentRow>
  <columnValue>mary</columnValue>
  <columnValue>science</columnValue>
  <columnValue>90</columnValue>
</currentRow>
<currentRow>
  <columnValue>mary</columnValue>
  <columnValue>history</columnValue>
  <columnValue>95</columnValue>
</currentRow>
<currentRow>
  <columnValue>mark</columnValue>
  <columnValue>maths</columnValue>
  <columnValue>70</columnValue>
</currentRow>
<currentRow>
  <columnValue>tim</columnValue>
  <columnValue><null/></columnValue>
  <columnValue>0</columnValue>
</currentRow>

这是我的xml结构

XSLT 为每一行运行 for-each,如下所示:

<xsl:for-each select="//wrs:currentRow">
        <xsl:variable name="theCurrentStudent">
        <xsl:value-of select="wrs:columnValue[1]"/>
        </xsl:variable>    
        <xsl:element name="tr">
       <xsl:if test="not(preceding-sibling::wrs:currentRow/wrs:columnValue[1]=$theCurrentStudent)">
        <xsl:element name="td">
         <xsl:attribute name="rowspan">
          <xsl:value-of select="count(//wrs:currentRow[wrs:columnValue[1]=$theCurrentStudent])"/>
         </xsl:attribute>
         <xsl:value-of select="$theCurrentStudent"/>
        </xsl:element>
       </xsl:if>



       <xsl:element name="td">
        <xsl:value-of select="wrs:columnValue[2]"/>
       </xsl:element>       




      <xsl:element name="td">
       <xsl:value-of select="wrs:columnValue[3]"> 
      <xsl:element name="tr">

       <xsl:value-of select="sum(wrs:columnValue[3])"/>
     </xsl:element>    
       </xsl:value-of>     
      </xsl:element> 
</xsl:element>
     </xsl:for-each>

除了脚本中的所有内容之外,还有什么想法可以在 XSLT 脚本中执行此操作吗?

【问题讨论】:

  • 您能发布您的 XSLT 和示例 XML 输入吗?

标签: html xml xslt-1.0


【解决方案1】:

这种转变

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kSameStudent" match="currentRow"
  use="generate-id(preceding-sibling::currentRow
                     [columnValue[1] = current()/columnValue[1]]
                        [last()]
                   )"/>

 <xsl:template match="/*">
  <html>
   <table border="1">
     <xsl:apply-templates select=
     "*[not(columnValue[1]
           =
            preceding-sibling::*[1]/columnValue[1]
           )]"/>
   </table>
  </html>
 </xsl:template>

 <xsl:template match="currentRow">
   <xsl:variable name="vGroup" select=
    ". | key('kSameStudent', generate-id())"/>

   <xsl:apply-templates mode="inGroup" select="$vGroup" />
   <tr>
     <td>&#xA0;</td>
     <td>Total</td>
     <td><xsl:value-of select=
       "sum($vGroup/columnValue[3])"/>
     </td>
   </tr>
 </xsl:template>

 <xsl:template match="currentRow" mode="inGroup">
  <xsl:variable name="vPos" select="position()"/>
  <tr>
   <td>
    <xsl:value-of select=
    "concat('&#xA0;', columnValue[1][$vPos = 1])"/>
   </td>
   <td>
    <xsl:value-of select=
    "concat('&#xA0;', columnValue[2][not(null)])"/>
   </td>
   <td>
    <xsl:value-of select=
    "concat('&#xA0;', columnValue[3])"/>
   </td>
  </tr>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时(格式正确):

<t>
    <currentRow>
        <columnValue>alice</columnValue>
        <columnValue>
            <null/>
        </columnValue>
        <columnValue>0</columnValue>
    </currentRow>
    <currentRow>
        <columnValue>bob</columnValue>
        <columnValue>maths</columnValue>
        <columnValue>74</columnValue>
    </currentRow>
    <currentRow>
        <columnValue>bob</columnValue>
        <columnValue>science</columnValue>
        <columnValue>84</columnValue>
    </currentRow>
    <currentRow>
        <columnValue>mary</columnValue>
        <columnValue>maths</columnValue>
        <columnValue>80</columnValue>
    </currentRow>
    <currentRow>
        <columnValue>mary</columnValue>
        <columnValue>science</columnValue>
        <columnValue>90</columnValue>
    </currentRow>
    <currentRow>
        <columnValue>mary</columnValue>
        <columnValue>history</columnValue>
        <columnValue>95</columnValue>
    </currentRow>
    <currentRow>
        <columnValue>mark</columnValue>
        <columnValue>maths</columnValue>
        <columnValue>70</columnValue>
    </currentRow>
    <currentRow>
        <columnValue>tim</columnValue>
        <columnValue>
            <null/>
        </columnValue>
        <columnValue>0</columnValue>
    </currentRow>
</t>

产生想要的正确结果

<html>
   <table border="1">
      <tr>
         <td>&nbsp;alice</td>
         <td>&nbsp;</td>
         <td>&nbsp;0</td>
      </tr>
      <tr>
         <td>&nbsp;</td>
         <td>Total</td>
         <td>0</td>
      </tr>
      <tr>
         <td>&nbsp;bob</td>
         <td>&nbsp;maths</td>
         <td>&nbsp;74</td>
      </tr>
      <tr>
         <td>&nbsp;</td>
         <td>&nbsp;science</td>
         <td>&nbsp;84</td>
      </tr>
      <tr>
         <td>&nbsp;</td>
         <td>Total</td>
         <td>158</td>
      </tr>
      <tr>
         <td>&nbsp;mary</td>
         <td>&nbsp;maths</td>
         <td>&nbsp;80</td>
      </tr>
      <tr>
         <td>&nbsp;</td>
         <td>&nbsp;science</td>
         <td>&nbsp;90</td>
      </tr>
      <tr>
         <td>&nbsp;</td>
         <td>&nbsp;history</td>
         <td>&nbsp;95</td>
      </tr>
      <tr>
         <td>&nbsp;</td>
         <td>Total</td>
         <td>265</td>
      </tr>
      <tr>
         <td>&nbsp;mark</td>
         <td>&nbsp;maths</td>
         <td>&nbsp;70</td>
      </tr>
      <tr>
         <td>&nbsp;</td>
         <td>Total</td>
         <td>70</td>
      </tr>
      <tr>
         <td>&nbsp;tim</td>
         <td>&nbsp;</td>
         <td>&nbsp;0</td>
      </tr>
      <tr>
         <td>&nbsp;</td>
         <td>Total</td>
         <td>0</td>
      </tr>
   </table>
</html>

【讨论】:

  • 感谢 Dimitre 提供解决方案并为此努力。但是,我修改了我的解决方案并试图让它工作,最后它工作了我会尝试这个,并会发布它是否工作。再次感谢。欣赏!
  • @user640232:不客气。我希望这个答案将有助于改进您当前的解决方案,并了解另一种有效的方法。
【解决方案2】:

在你的 foreach 中,你将不得不重新计算总分

<xsl:for-each select="student/subject">
    <xsl:variable name="scoreBase" select="score" />
    <xsl:variable name="calculatedTotal"
        select="student/total/score" />
    <xsl:variable name="calculatedTotal" select="$scoreBase + $calculatedTotal" />
</xsl:for-each>

【讨论】:

  • 你怎么知道 OP 正在使用 xsl:for-each 或者 XML 输入的结构可能是什么样的?
  • Ojota - 这不起作用,我也想在其中插入总数,我已经发布了您可能想要参考的 xml 和 xslt 脚本。谢谢
【解决方案3】:

你能在 foreach 的末尾试试这个吗

<xsl:variable name="temp" select="sum(preceding-sibling::wrs:columnValue[3])"/> 
<td><xsl:value-of select="$temp"/></td>

【讨论】:

  • 我在 for-each 结束之前添加了这个(如我的代码所示),它在每行之后的第一列中为我提供了一个额外的行,其值为 0。我还尝试了rowspan count+1,这给了我额外的一行,第二列中的值为0
猜你喜欢
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 2021-11-24
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多