2

其实我不是在问问题。我注册了 stackoverflow 来回馈一个帮助过我很多次的社区。

如果您使用的是 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 &lt; 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 &lt; 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>

编辑:您还有其他方法可以实现相同的目标吗?

4

2 回答 2

6

首先,感谢您的贡献。但是,此实现存在一些问题。秒输出不考虑前导 0,但即使这是固定的,如果任何数字恰好为 0,输出也可能不明确。例如,输入3600560536300都产生结果10:05

同样,如果其中两个数字恰好为零。输入36000产生输出10:,输入60010两者都产生结果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如果要格式化的值是当前上下文节点,它还允许省略参数。

于 2013-03-12T20:39:18.303 回答
2

在 XSLT 1.0 中将秒数转换为时间 (HH:MM:SS):

<xsl:template name="seconds-to-time">
    <xsl:param name="seconds"/>
    <xsl:variable name="h" select="floor($seconds div 3600)"/>
    <xsl:variable name="m" select="floor($seconds div 60) mod 60"/>
    <xsl:variable name="s" select="$seconds mod 60"/>

    <xsl:value-of select="format-number($h, '00')" />
    <xsl:value-of select="format-number($m, ':00')" />
    <xsl:value-of select="format-number($s, ':00')" />
</xsl:template>
于 2017-02-13T11:06:32.820 回答