如何在XSLT中计算两个给定时间的时间差?
计算手术时间差并格式化显示为“Xh Ym”格式
问题说明
现有如下XML数据,需要计算手术开始与结束时间的差值,并以2h 52m的格式输出:
<Surgery> <SURGERY_START_TIME>9:02</SURGERY_START_TIME> <SURGERY_STOP_TIME>11:45</SURGERY_STOP_TIME> </Surgery>
原尝试的XSLT代码无法运行,核心原因是直接对时间字符串做减法无效——XSLT不会自动将9:02这类字符串解析为可计算的时间数值。
解决方案
通过手动拆分时间的小时和分钟,转换为总分钟数后计算差值,再转回小时+分钟的格式:
XSLT 1.0 实现代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/Surgery"> <!-- 计算开始时间总分钟数 --> <xsl:variable name="start-hour" select="substring-before(SURGERY_START_TIME, ':')" /> <xsl:variable name="start-minute" select="substring-after(SURGERY_START_TIME, ':')" /> <xsl:variable name="start-total" select="$start-hour * 60 + $start-minute" /> <!-- 计算结束时间总分钟数 --> <xsl:variable name="stop-hour" select="substring-before(SURGERY_STOP_TIME, ':')" /> <xsl:variable name="stop-minute" select="substring-after(SURGERY_STOP_TIME, ':')" /> <xsl:variable name="stop-total" select="$stop-hour * 60 + $stop-minute" /> <!-- 计算时间差总分钟数 --> <xsl:variable name="diff-total" select="$stop-total - $start-total" /> <!-- 转换为小时和剩余分钟 --> <xsl:variable name="diff-hour" select="floor($diff-total div 60)" /> <xsl:variable name="diff-minute" select="$diff-total mod 60" /> <!-- 拼接输出目标格式 --> <xsl:value-of select="concat($diff-hour, 'h ', $diff-minute, 'm')" /> </xsl:template> </xsl:stylesheet>
代码说明
- 用
substring-before和substring-after分割时间字符串,提取小时、分钟部分 - 将小时转为分钟后求和,把时间统一为总分钟数,便于计算差值
- 通过整除+取整得到小时数,取余得到剩余分钟数
- 用
concat拼接成Xh Ym格式的字符串
输出结果
针对给定的XML数据,运行上述代码后会输出:2h 52m
内容的提问来源于stack exchange,提问作者vishnu
相关产品推荐
相关产品推荐

