Xml XSLT中的秒到时间

Xml XSLT中的秒到时间,xml,xslt,datetime,xslt-1.0,seconds,Xml,Xslt,Datetime,Xslt 1.0,Seconds,其实我不是在问问题。我注册了stackoverflow,以回报一个曾经多次帮助过我的社区 如果您使用的是XSLT1.0,则没有内置的时间计算。我想出了这个把秒转换成分和小时的方法。我希望这对别人有帮助 <xsl:template name="format-duration"> <xsl:param name="value" /> <xsl:variable name="minutes" select="floor($value div 60) mod 60

其实我不是在问问题。我注册了stackoverflow,以回报一个曾经多次帮助过我的社区

如果您使用的是XSLT1.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>

0
:
0
:
编辑: 你有没有其他方法达到同样的效果


首先,感谢您的贡献。然而,这种实现存在一些问题。秒输出不考虑前导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>

这样,小时仅在非零或可选打开时显示,秒默认包括在内,但可以通过使用参数值可选地忽略。这将减少时间应该代表什么的模糊性


如果要格式化的值是当前上下文节点,它还允许省略
参数。

将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>


请提出问题并自己回答。接受你自己的答案没关系:)你的意思是“从秒到持续时间”。为什么要在几个小时内停下来?那几天,几周呢?我知道,几个月和几年的时间更具挑战性,但为什么不尝试一下呢?最后,这似乎是一项不必要的努力投资——最好使用XPath 2.0(和XSLT 2.0)中提供的日期-时间算法。与其在问题中发布解决方案,不如创建一个问题并将解决方案作为答案发布。我同意Dimitre的观点,您可以从主机使用外部处理器(如Saxon)来实现XSLT2.0。。您不必在XSLT1.0中苦苦挣扎。exslt是2001年创建的XSLT1.0的扩展。。试试这个链接,谢谢大家的支持。我以前从未在这里发布过(长期潜伏者)。很高兴看到一些改进。顺便说一句,我知道XSLT2.0可以处理时间,但由于一些愚蠢的原因,我无法在我所做的事情中使用时间。我想某个地方的人也会遇到这样的事情。我希望我能在很多事情上使用2.0。谢谢!;)我不得不把会议记录改成这样:
非常感谢,真的帮了我的忙;)@当你尝试我的方法时发生了什么?它似乎可以正常工作。这个公式不正确:90秒应该返回
01:30
,而不是
02:30
@michael.hor257k。