XSLT 将毫秒转换为时间码
XSLT Convert milliseconds to timecode
您好,祝您愉快!
我想找出两个步骤:
- (但不优先)从 xml 带有标签“持续时间”的文件中获取整数,以毫秒为单位
- 我正在尝试将“持续时间”毫秒转换为看起来像 hh:mm:ss:ff 的时间码,其中 h - 小时,m - 分钟,s - 秒和 f - 帧(25 帧 = 1 秒)。
如我所见,算法是:
z=milliseconds
h=z idiv (60*60*25)
m=(z-h*60*60*25) idiv (60*25)
s=(z-h*60*60*25-m*60*25) idiv 25
f=(z-h*60*60*25-m*60*25-s*25)
知道如何在 XSLT 中正确地进行计算吗?
考虑以下示例:
XML
<input>
<milliseconds>45045500</milliseconds>
</input>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="input">
<output>
<xsl:variable name="f" select="floor(milliseconds div 40) mod 25" />
<xsl:variable name="s" select="floor(milliseconds div 1000) mod 60" />
<xsl:variable name="m" select="floor(milliseconds div 60000) mod 60" />
<xsl:variable name="h" select="floor(milliseconds div 3600000)" />
<timecode>
<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:value-of select="format-number($f, ':00')"/>
</timecode>
</output>
</xsl:template>
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
<output>
<timecode>12:30:45:12</timecode>
</output>
请注意,此 会截断 小数帧。如果要舍入到最近的帧,则将变量更改为:
<xsl:variable name="totalFrames" select="round(milliseconds div 40)" />
<xsl:variable name="f" select="$totalFrames mod 25" />
<xsl:variable name="s" select="floor($totalFrames div 25) mod 60" />
<xsl:variable name="m" select="floor($totalFrames div 1500) mod 60" />
<xsl:variable name="h" select="floor($totalFrames div 90000)" />
这里的结果是:
<timecode>12:30:45:13</timecode>
在 XSLT 2.0 或更高版本中,您可以将表达式 floor($a div $b)
缩短为 $a idiv $b
。
您好,祝您愉快!
我想找出两个步骤:
- (但不优先)从 xml 带有标签“持续时间”的文件中获取整数,以毫秒为单位
- 我正在尝试将“持续时间”毫秒转换为看起来像 hh:mm:ss:ff 的时间码,其中 h - 小时,m - 分钟,s - 秒和 f - 帧(25 帧 = 1 秒)。 如我所见,算法是:
z=milliseconds
h=z idiv (60*60*25)
m=(z-h*60*60*25) idiv (60*25)
s=(z-h*60*60*25-m*60*25) idiv 25
f=(z-h*60*60*25-m*60*25-s*25)
知道如何在 XSLT 中正确地进行计算吗?
考虑以下示例:
XML
<input>
<milliseconds>45045500</milliseconds>
</input>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="input">
<output>
<xsl:variable name="f" select="floor(milliseconds div 40) mod 25" />
<xsl:variable name="s" select="floor(milliseconds div 1000) mod 60" />
<xsl:variable name="m" select="floor(milliseconds div 60000) mod 60" />
<xsl:variable name="h" select="floor(milliseconds div 3600000)" />
<timecode>
<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:value-of select="format-number($f, ':00')"/>
</timecode>
</output>
</xsl:template>
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
<output>
<timecode>12:30:45:12</timecode>
</output>
请注意,此 会截断 小数帧。如果要舍入到最近的帧,则将变量更改为:
<xsl:variable name="totalFrames" select="round(milliseconds div 40)" />
<xsl:variable name="f" select="$totalFrames mod 25" />
<xsl:variable name="s" select="floor($totalFrames div 25) mod 60" />
<xsl:variable name="m" select="floor($totalFrames div 1500) mod 60" />
<xsl:variable name="h" select="floor($totalFrames div 90000)" />
这里的结果是:
<timecode>12:30:45:13</timecode>
在 XSLT 2.0 或更高版本中,您可以将表达式 floor($a div $b)
缩短为 $a idiv $b
。