如何使用XSLT 1.0将小时分钟数值转换为PT*H*M时长格式
XSLT 1.0 小时数值转PTnHnM时长格式实现
需求是将输入的小时单位数值(支持小数)转换为ISO 8601标准的PT*H*M时长格式,适配XSLT 1.0版本,对应转换规则:
- 输入
1→ 输出PT1H - 输入
6.5→ 输出PT6H30M - 输入
0.5(原示例此处笔误写为6.5)→ 输出PT30M
直接用XSLT 1.0内置数学函数计算即可,不需要额外扩展,完整转换代码如下:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cre="替换为你的cre命名空间实际地址"> <!-- 身份模板,原样复制其余不需要转换的节点、属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配timeTotal节点执行格式转换 --> <xsl:template match="cre:timeTotal"> <xsl:copy> <xsl:variable name="totalVal" select="number(.)"/> <xsl:variable name="hours" select="floor($totalVal)"/> <!-- 小数部分转分钟,四舍五入规避浮点计算误差 --> <xsl:variable name="minutes" select="round(($totalVal - $hours) * 60)"/> <xsl:text>PT</xsl:text> <xsl:if test="$hours > 0"> <xsl:value-of select="$hours"/> <xsl:text>H</xsl:text> </xsl:if> <xsl:if test="$minutes > 0"> <xsl:value-of select="$minutes"/> <xsl:text>M</xsl:text> </xsl:if> <!-- 处理输入为0的边界情况,避免输出非法的空PT --> <xsl:if test="$hours = 0 and $minutes = 0"> <xsl:text>0H</xsl:text> </xsl:if> </xsl:copy> </xsl:template> </xsl:stylesheet>
使用注意事项:
- 把代码里
cre前缀对应的命名空间地址替换为你业务中实际使用的地址,否则无法匹配到目标节点 - 分钟计算默认用四舍五入,如果业务要求截断取整,把
round换成floor即可 - 代码兼容所有标准XSLT 1.0解析器,不需要依赖任何第三方扩展函数
内容的提问来源于stack exchange,提问作者Simran
相关产品推荐
相关产品推荐

