Вот пример того, как вы можете добавить два тайм-кода, используя XSLT 1.0, при условии, что:
- Частота кадров известна (в этом примере мы будем использовать 25 кадров в секунду);
- Тайм-код НЕ пропущенный кадр .
XML
<input>
<segment>
<start>10:00:00:00</start>
<duration>00:01:15:00</duration>
</segment>
<segment>
<start>23:45:45:15</start>
<duration>00:15:30:20</duration>
</segment>
</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:strip-space elements="*"/>
<xsl:param name="fps" select="25"/>
<xsl:template match="/input">
<output>
<xsl:for-each select="segment">
<xsl:variable name="start-in-frames">
<xsl:call-template name="timecode-to-frames">
<xsl:with-param name="timecode" select="start"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="duration-in-frames">
<xsl:call-template name="timecode-to-frames">
<xsl:with-param name="timecode" select="duration"/>
</xsl:call-template>
</xsl:variable>
<xsl:copy>
<xsl:copy-of select="*"/>
<end>
<xsl:call-template name="frames-to-timecode">
<xsl:with-param name="frames" select="$start-in-frames + $duration-in-frames"/>
</xsl:call-template>
</end>
</xsl:copy>
</xsl:for-each>
</output>
</xsl:template>
<xsl:template name="timecode-to-frames">
<xsl:param name="timecode"/>
<xsl:variable name="hh" select="substring($timecode, 1, 2)"/>
<xsl:variable name="mm" select="substring($timecode, 4, 2)"/>
<xsl:variable name="ss" select="substring($timecode, 7, 2)"/>
<xsl:variable name="ff" select="substring($timecode, 10, 2)"/>
<xsl:value-of select="$fps * (3600 * $hh + 60 * $mm + $ss) + $ff"/>
</xsl:template>
<xsl:template name="frames-to-timecode">
<xsl:param name="frames"/>
<xsl:variable name="seconds" select="floor($frames div $fps)" />
<xsl:variable name="h" select="floor($seconds div 3600) mod 24"/>
<xsl:variable name="m" select="floor($seconds div 60) mod 60"/>
<xsl:variable name="s" select="$seconds mod 60"/>
<xsl:variable name="f" select="$frames mod $fps" />
<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')" />
</xsl:template>
</xsl:stylesheet>
Результат
<?xml version="1.0" encoding="UTF-8"?>
<output>
<segment>
<start>10:00:00:00</start>
<duration>00:01:15:00</duration>
<end>10:01:15:00</end>
</segment>
<segment>
<start>23:45:45:15</start>
<duration>00:15:30:20</duration>
<end>00:01:16:10</end>
</segment>
</output>
Обратите внимание, что в вашем случае это может быть немного проще, так как duration
элемент уже содержит количество кадров в своем атрибуте count
(по крайней мере, так он выглядит).