寻求XQuery/XSLT 1.0函数:将时长转换为PT*H*M格式
时长转
PT*H*M格式的实现方案 XQuery 函数实现
以下是一个XQuery函数,可将整数或带小数的小时数转换为符合要求的时长格式:
declare function local:convert-to-duration($hours as xs:double?) as xs:string? { if ($hours) then let $total-minutes := $hours * 60, $whole-hours := floor($total-minutes div 60), $remaining-minutes := floor($total-minutes mod 60) return concat( 'PT', if ($whole-hours > 0) then concat($whole-hours, 'H') else '', if ($remaining-minutes > 0) then concat($remaining-minutes, 'M') else '' ) else () };
使用示例
- 输入
local:convert-to-duration(5)→ 返回PT5H - 输入
local:convert-to-duration(5.5)→ 返回PT5H30M - 输入
local:convert-to-duration(0.25)→ 返回PT15M
XSLT 1.0 模板实现
如果XQuery环境不可用,可使用XSLT1.0的命名模板来实现相同功能:
<xsl:template name="convert-to-duration"> <xsl:param name="hours" select="0"/> <xsl:variable name="total-minutes" select="$hours * 60"/> <xsl:variable name="whole-hours" select="floor($total-minutes div 60)"/> <xsl:variable name="remaining-minutes" select="floor($total-minutes mod 60)"/> <xsl:text>PT</xsl:text> <xsl:if test="$whole-hours > 0"> <xsl:value-of select="$whole-hours"/> <xsl:text>H</xsl:text> </xsl:if> <xsl:if test="$remaining-minutes > 0"> <xsl:value-of select="$remaining-minutes"/> <xsl:text>M</xsl:text> </xsl:if> </xsl:template>
使用示例
- 调用模板:
输出:<xsl:call-template name="convert-to-duration"> <xsl:with-param name="hours" select="5"/> </xsl:call-template>PT5H - 调用模板:
输出:<xsl:call-template name="convert-to-duration"> <xsl:with-param name="hours" select="5.5"/> </xsl:call-template>PT5H30M
内容的提问来源于stack exchange,提问作者Simran
相关产品推荐
相关产品推荐

