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

XML转HTML表格:Gym列跨有效行数异常问题求助

解决Gym列跨有效行的XSLT方案

嘿,我来帮你搞定这个Gym列跨行的问题!核心症结在于你需要先精准统计出过滤后保留的非Gym服务行数,再给Gym列设置对应的rowspan属性,这样它就能完美跨所有有效行了。下面是具体的实现步骤和示例代码:

1. 先筛选有效服务并统计数量

首先定义变量,过滤掉过去6个月+当前6个月数值全为0的非Gym服务,同时统计这些有效服务的数量:

<!-- 假设你的XML结构是/services/service,每个service下有name和多个month节点(包含value) -->
<xsl:variable name="valid-services" select="/services/service[
    not(name='Gym') 
    and not(
        <!-- 过去6个月所有值为0 -->
        every $m in month[position() > last()-12 and position() <= last()-6] satisfies $m/value = 0 
        and 
        <!-- 当前6个月所有值为0 -->
        every $m in month[position() > last()-6] satisfies $m/value = 0
    )
]" />

<!-- 统计有效服务的行数 -->
<xsl:variable name="valid-count" select="count($valid-services)" />

注:如果你的“数值为0”是指总和为0而非每个月都为0,把every...satisfies换成sum(...) = 0即可。

2. 构建带跨行Gym列的表格

接下来生成HTML表格,Gym列只在第一行出现,并用rowspan="{$valid-count}"跨所有有效行:

<table border="1">
  <thead>
    <tr>
      <th>Gym服务</th>
      <th>服务名称</th>
      <th>过去6个月总计</th>
      <th>当前6个月总计</th>
    </tr>
  </thead>
  <tbody>
    <!-- 第一行:渲染Gym列+第一个有效服务 -->
    <xsl:if test="$valid-count > 0">
      <tr>
        <!-- Gym列跨行 -->
        <td rowspan="{$valid-count}">
          <!-- 这里输出Gym的统计数据,比如过去12个月的总和 -->
          <xsl:value-of select="/services/service[name='Gym']/sum(month[position() > last()-12]/value)" />
        </td>
        <!-- 第一个有效服务的内容 -->
        <td><xsl:value-of select="$valid-services[1]/name" /></td>
        <td><xsl:value-of select="sum($valid-services[1]/month[position() > last()-12 and position() <= last()-6]/value)" /></td>
        <td><xsl:value-of select="sum($valid-services[1]/month[position() > last()-6]/value)" /></td>
      </tr>

      <!-- 渲染剩下的有效服务,不需要Gym列 -->
      <xsl:for-each select="$valid-services[position() > 1]">
        <tr>
          <td><xsl:value-of select="name" /></td>
          <td><xsl:value-of select="sum(month[position() > last()-12 and position() <= last()-6]/value)" /></td>
          <td><xsl:value-of select="sum(month[position() > last()-6]/value)" /></td>
        </tr>
      </xsl:for-each>
    </xsl:if>
    <!-- 处理没有有效服务的情况 -->
    <xsl:if test="$valid-count = 0">
      <tr>
        <td colspan="4">没有符合条件的服务</td>
      </tr>
    </xsl:if>
  </tbody>
</table>

关键注意事项

  • 确认月份节点的位置逻辑是否符合你的XML结构:last()-12到last()-6代表过去6个月,last()-6之后是当前6个月,根据你的实际数据顺序调整。
  • 一定要判断valid-count是否为0,避免出现rowspan="0"的无效HTML属性。
  • 测试时可以先单独输出$valid-count的值,确认统计的有效行数是否正确,这是跨行是否准确的核心。

内容的提问来源于stack exchange,提问作者fynx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:19:09