Добавить временной код и продолжительность в xslt - PullRequest
0 голосов
/ 01 апреля 2020

Я очень новичок в xslt, мне нужно добавить SOM (из поля <som>) и Duration (из поля <duration>) в ниже xml:

<root>
    <segmentation size="2">
        <segment index="0">
            <part_number>1</part_number>
            <part_total>2</part_total>
            <som>10:00:00:00</som>
            <duration count="1875">00:01:15:00</duration>
        </segment>
    </segmentation>
</root>

Я пробуя этот путь, но для "t c out" это дает результат, подобный "tc out": xs:Time(10:00:00:00) + xs:dayTimeDuration(00:01:15:00), мне нужно получить значение "t c out" как "tc out": "10:01:15:00".

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no"/>
<xsl:template match="/">
{
"recordingSegment":[
    <xsl:for-each select="/root/segmentation/segment">
        { 
            <xsl:if test="part_number != ''">
                "segmentDescription": "<xsl:value-of select="part_number"/>",
            </xsl:if>               
            <xsl:if test="som != ''">
                "Time Code In": "<xsl:value-of select="som"/>",
            </xsl:if>               
            <xsl:if test="duration != ''">
                "duration": "<xsl:value-of select="duration"/>",
            </xsl:if>
            <xsl:if test="duration != ''">
                "tc out": xs:Time(<xsl:value-of select="som"/>) +  xs:dayTimeDuration(<xsl:value-of select="duration"/>),
            </xsl:if>
        },
    </xsl:for-each>]
}
</xsl:template>
</xsl:stylesheet>

Пожалуйста, помогите мне, ребята, заранее спасибо.

1 Ответ

0 голосов
/ 03 апреля 2020

Вот пример того, как вы можете добавить два тайм-кода, используя XSLT 1.0, при условии, что:

  1. Частота кадров известна (в этом примере мы будем использовать 25 кадров в секунду);
  2. Тайм-код НЕ пропущенный кадр .

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 (по крайней мере, так он выглядит).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...