请求修改XSLT实现NetPay类型Amount全文件汇总并置首行
解决方案:汇总XML中"Net Pay"的Amount值并添加首行输出
核心逻辑
因为所有记录的PayDate一致,无需复杂分组,直接用XPath的sum()函数筛选出所有Desc为"Net Pay"的Record节点,对其Amount字段求和即可。
示例XML
<PayrollData> <Record> <PayDate>2024-05-31</PayDate> <Desc>Net Pay</Desc> <Amount>1500.00</Amount> </Record> <Record> <PayDate>2024-05-31</PayDate> <Desc>Net Pay</Desc> <Amount>2200.00</Amount> </Record> <Record> <PayDate>2024-05-31</PayDate> <Desc>Bonus</Desc> <Amount>500.00</Amount> </Record> </PayrollData>
修改后的XSLT(新增首行汇总)
假设现有XSLT为表格输出格式,修改后代码如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <xsl:template match="/"> <html> <body> <table border="1"> <!-- 新增首行:Net Pay汇总 --> <tr> <td colspan="3">Total Net Pay: <xsl:value-of select="sum(//Record[Desc='Net Pay']/Amount)"/></td> </tr> <!-- 原有输出逻辑 --> <tr> <th>PayDate</th> <th>Desc</th> <th>Amount</th> </tr> <xsl:for-each select="//Record"> <tr> <td><xsl:value-of select="PayDate"/></td> <td><xsl:value-of select="Desc"/></td> <td><xsl:value-of select="Amount"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
期望输出样例
<html> <body> <table border="1"> <tr> <td colspan="3">Total Net Pay: 3700.00</td> </tr> <tr> <th>PayDate</th> <th>Desc</th> <th>Amount</th> </tr> <tr> <td>2024-05-31</td> <td>Net Pay</td> <td>1500.00</td> </tr> <tr> <td>2024-05-31</td> <td>Net Pay</td> <td>2200.00</td> </tr> <tr> <td>2024-05-31</td> <td>Bonus</td> <td>500.00</td> </tr> </table> </body> </html>
关于分组失败的说明
你尝试按PayDate分组未成功,本质是因为所有记录的PayDate完全相同,分组后只会得到一个组,反而多此一举。直接使用全局的sum()函数筛选目标节点,是最简洁高效的实现方式。
内容的提问来源于stack exchange,提问作者Greg Gregerson
相关产品推荐
相关产品推荐

