You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于XSLT2/XSLT3实现维护账单XML的排序转置HTML表格展示

修正XSLT代码实现账单数据处理需求

核心需求明确

  • 对XML中的<upkShare>元素,按month_year属性实现升序/降序排序
  • 自动关联余额:上一条记录的期末余额作为下一条记录的期初余额
  • 将账单数据行列转置,生成符合样式的HTML表格

常见错误修正点

  1. 排序逻辑错误:原代码可能未在正确节点上应用<xsl:sort>,或未匹配month_year的格式指定排序规则
  2. 余额传递失效:未利用XSLT序列处理能力,错误使用固定节点引用而非动态获取前序节点的期末值
  3. 行列转置逻辑僵化:硬编码列名导致扩展性差,未动态提取需展示的字段

修正后完整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 04:32:10