我正在使用xsl版本2.0
我有一个时间字段,我需要添加1。 我从以下节点获取格式化数字:
<xsl:value-of select="Master/End/Timecode"/>
<xsl:text>
“主/结束/时间码”中的数据看起来像01:00:00:00 基本上是时间 - 小时:分钟:秒:帧 帧是从o到23的计数。如果帧= 23,如何向帧添加1并使秒和分钟递增。
示例01:00:59:23加1将得到01:01:00:00的结果。 任何想法
答案 0 :(得分:2)
只需将其转换为帧,递增,然后转换回来:
<xsl:analyze-string select="Master/End/Timecode" regex="^(\d+):(\d+):(\d+):(\d+)$">
<xsl:matching-substring>
<!-- Split into components -->
<xsl:variable name="hours"
select="xs:integer(regex-group(1))"/>
<xsl:variable name="minutes"
select="xs:integer(regex-group(2))"/>
<xsl:variable name="seconds"
select="xs:integer(regex-group(3))"/>
<xsl:variable name="frames"
select="xs:integer(regex-group(4))"/>
<!-- Calculate total amount of frames -->
<xsl:variable name="total-frames"
select="$hours * 60 * 60 * 24 +
$minutes * 60 * 24 +
$seconds * 24 +
$frames "/>
<!-- Add 1 frame -->
<xsl:variable name="remaining-frames"
select="$total-frames + 1"/>
<!-- Calculate new component values -->
<xsl:variable name="new-hours"
select="$remaining-frames idiv (60 * 60 * 24)"/>
<xsl:variable name="remaining-frames"
select="$remaining-frames mod (60 * 60 * 24)"/>
<xsl:variable name="new-minutes"
select="$remaining-frames idiv (60 * 24)"/>
<xsl:variable name="remaining-frames"
select="$remaining-frames mod (60 * 24)"/>
<xsl:variable name="new-seconds"
select="$remaining-frames idiv 24"/>
<xsl:variable name="new-frames"
select="$remaining-frames mod 24"/>
<!-- Recombine components -->
<xsl:value-of select="$new-hours"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="$new-minutes"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="$new-seconds"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="$new-frames"/>
</xsl:matching-substring>
</xsl:analyze-string>
答案 1 :(得分:0)
这听起来像是你想写custom XPath function或process outside of XSLT的东西。有很多方法可以让这种情况发生,但它们会变得非常复杂,非常快。
答案 2 :(得分:0)
正确的转换算法毫秒(SSS),单位为HH:mm:ss:ff 以上情况并非如此。
Developed an algorithm: z = 8415
ch=z idiv (60*60*25)
m=(z-ch*60*60*25) idiv (60*25)
s=(z-ch*60*60*25-m*60*25) idiv 25
f=(z-ch*60*60*25-m*60*25-s*25)
Total: 0:5:36:15
答案 3 :(得分:0)
这可以通过我的XSLT时间码库完成:https://github.com/sshaw/xslt-timecode。 有了它,你可以做类似的事情:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tc="http://screenstaring.com/xslt/timecode">
<xsl:import href="timecode.xsl"/>
<xsl:call-template name="tc:add">
<xsl:with-param name="timecode1">01:00:00:00</xsl:with-param>
<xsl:with-param name="timecode2">00:00:00:01</xsl:with-param>
</xsl:call-template>
<!-- Or -->
<xsl:variable name="frames">
<xsl:call-template name="tc:to-frames">
<xsl:with-param name="timecode">01:00:00:00</xsl:with-param>
<xsl:with-param name="fps">23.97</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="plus-one">
<xsl:call-template name="tc:from-frames">
<xsl:with-param name="frames" select="$frames + 1"/>
<xsl:with-param name="fps">23.97</xsl:with-param>
</xsl:call-template>
</xsl:variable>
遗憾的是,你不能只添加1,尽管multiply
和divide
支持整数操作数,因此add
也应该支持它。