其实我不是在问问题。我注册了 stackoverflow,以回馈曾多次帮助过我的社区。p>
如果您使用的是 XSLT 1.0,则没有内置时间计算。我想出了这个将秒转换为分钟和小时。我希望这对某人有帮助!
<xsl:template name="format-duration">
<xsl:param name="value" />
<xsl:variable name="minutes" select="floor($value div 60) mod 60" />
<xsl:variable name="seconds" select="$value mod 60" />
<xsl:variable name="hours" select="floor($value div 3600)" />
<xsl:if test="$hours">
<xsl:if test="$hours < 10">
<xsl:text>0</xsl:text>
</xsl:if>
<xsl:value-of select="$hours" />
<xsl:text>:</xsl:text>
</xsl:if>
<xsl:if test="$minutes">
<xsl:if test="$minutes < 10">
<xsl:text>0</xsl:text>
</xsl:if>
<xsl:value-of select="$minutes" />
<xsl:text></xsl:text>
</xsl:if>
<xsl:if test="$minutes and $seconds">
<xsl:text>:</xsl:text>
</xsl:if>
<xsl:if test="$seconds">
<xsl:value-of select="$seconds" />
<xsl:text></xsl:text>
</xsl:if>
</xsl:template>
EDIT: Do you have any other methods to achieve the same?
最佳答案
首先,感谢您的贡献。但是,此实现存在一些问题。秒输出不考虑前导 0,但即使它是固定的,如果任何数字恰好为 0,输出也可能不明确。例如,输入 36005
,605
和 36300
都产生结果 10:05
。
同样,如果两个数字恰好为零。输入 36000
产生输出 10:
,输入 600
和 10
都产生结果 10
。
以下是我将如何实现此功能:
<xsl:template name="format-duration">
<xsl:param name="value" select="." />
<xsl:param name="alwaysIncludeHours" select="false()" />
<xsl:param name="includeSeconds" select="true()" />
<xsl:if test="$value > 3600 or $alwaysIncludeHours">
<xsl:value-of select="concat(format-number($value div 3600, '00'), ':')"/>
</xsl:if>
<xsl:value-of select="format-number(floor($value div 60) mod 60, '00')" />
<xsl:if test="$includeSeconds">
<xsl:value-of select="concat(':', format-number($value mod 60, '00'))" />
</xsl:if>
</xsl:template>
这样,只有当小时不为零或可选择打开时才会显示小时,默认情况下包括秒,但可以使用参数值选择性地省略。这应该减少关于时间应该代表什么的歧义。
如果要格式化的值是当前上下文节点,它还允许省略 value
参数。
关于xml - XSLT 中的秒数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15370152/