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
相关产品推荐
相关产品推荐

