基于XSLT2/XSLT3实现维护账单XML的排序转置HTML表格展示
修正XSLT代码实现账单数据处理需求
核心需求明确
- 对XML中的
<upkShare>元素,按month_year属性实现升序/降序排序 - 自动关联余额:上一条记录的
期末余额作为下一条记录的期初余额 - 将账单数据行列转置,生成符合样式的HTML表格
常见错误修正点
- 排序逻辑错误:原代码可能未在正确节点上应用
<xsl:sort>,或未匹配month_year的格式指定排序规则 - 余额传递失效:未利用XSLT序列处理能力,错误使用固定节点引用而非动态获取前序节点的期末值
- 行列转置逻辑僵化:硬编码列名导致扩展性差,未动态提取需展示的字段
修正后完整XSLT代码
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <!-- 可配置排序方向:ascending/descending --> <xsl:param name="sort-direction" select="'ascending'"/> <!-- 预处理:生成排序后的upkShare序列 --> <xsl:variable name="sorted-records"> <xsl:perform-sort select="//upkShare"> <xsl:sort select="@month_year" order="{$sort-direction}" data-type="text"/> </xsl:perform-sort> </xsl:variable> <!-- 定义转置后要展示的字段列表 --> <xsl:variable name="display-fields" select=" '期初余额', '本月发生额', '期末余额', '统计月份' "/> <xsl:template match="/"> <html> <body> <table border="1" cellpadding="8" cellspacing="0"> <!-- 转置后的表头行 --> <tr> <xsl:for-each select="$display-fields"> <th style="background:#f0f0f0"><xsl:value-of select="."/></th> </xsl:for-each> </tr> <!-- 遍历排序后的账单记录 --> <xsl:for-each select="$sorted-records/upkShare"> <xsl:variable name="current-index" select="position()"/> <tr> <!-- 期初余额:第一条用初始值,后续取上一条的期末余额 --> <td> <xsl:choose> <xsl:when test="$current-index = 1"> <xsl:value-of select="initial_balance"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$sorted-records/upkShare[$current-index - 1]/final_balance"/> </xsl:otherwise> </xsl:choose> </td> <!-- 本月发生额 --> <td><xsl:value-of select="current_amount"/></td> <!-- 期末余额:优先用原数据,无则自动计算 --> <td> <xsl:value-of select=" if (final_balance) then final_balance else ( if ($current-index = 1) then initial_balance + current_amount else $sorted-records/upkShare[$current-index - 1]/final_balance + current_amount ) "/> </td> <!-- 统计月份 --> <td><xsl:value-of select="@month_year"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
关键实现说明
- 灵活排序:通过
sort-direction参数可一键切换升序/降序,无需修改核心逻辑 - 自动余额关联:利用
position()定位当前记录,通过序列索引$current-index - 1获取前序记录的期末余额,实现自动传递 - 可扩展转置:
display-fields变量统一管理展示字段,新增字段只需修改该变量,无需调整表格结构 - 兼容处理:代码基于XSLT3.0编写,若使用XSLT2.0,移除类型声明即可直接运行
内容的提问来源于stack exchange,提问作者mirexS
相关产品推荐
相关产品推荐

