2009-09-04 7 views
2

J'utilise xsl version 2.0calcul de temps en xslt

J'ai un champ de temps que j'ai besoin d'ajouter 1 à. Je reçois un nombre formaté à partir du noeud ci-dessous:

<xsl:value-of select="Master/End/Timecode"/> 
    <xsl:text> 

Les données contenues dans "Maître/Fin/Timecode" ressemble à 01: 00: 00: 00 heures essentiellement time--: minutes: secondes: frames les frames sont comptés de oo à 23. Comment ajouter 1 aux frames et augmenter les secondes et les minuts si frames = 23.

Exemple 01: 00: 59: 23 plus 1 donnerait un résultat de 01: 01: 00: 00. Toutes les idées

Répondre

2

Il suffit de le convertir en images, incrément, puis reconvertir:

<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> 
+0

Merci d'avoir regardé ce –

+0

sont les commandes d'analyse-chaîne et regex commandes valides pour le processeur sablotron? –

+0

Non, Sablotron est un processeur XSLT 1.0; 'analyze-string' et les amis sont tous des parties de XSLT 2.0. Cela dit, vous avez spécifiquement mentionné que vous utilisez XSLT 2.0 dans la question, alors maintenant je suis confus, puisque vous ne pouvez pas le faire avec Sablotron. –

0

Les millisecondes algorithme de traduction correcte (SSS) HH: mm: ss: ff Ce qui précède n'est pas vrai.

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 
0

C'est quelque chose qui peut être fait par ma bibliothèque timecode XSLT: https://github.com/sshaw/xslt-timecode. Avec elle, vous pouvez faire quelque chose comme:

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

Malheureusement vous ne pouvez pas ajouter 1, bien que multiply et divide opérandes entiers de support afin add devrait probablement soutenir aussi.