Question

Utilisation des dates XSLT 1.0 et recevez dans le format suivant:

20111129060804

Et j'ai besoin de pouvoir calculer les différences entre deux d'entre eux. Cependant, Je ne peux utiliser aucune extension.

J'ai également d'autres limites:

  • Je suis limité quant aux espaces de noms qui peuvent être utilisés à l'intérieur d'un XSLT,
  • Et lorsque j'utilise la feuille de style XSL (une application tierce), elle ne traitera pas correctement les actions d'inclusion / d'importation dans le XSL.

Donc, en effet, le XSLT que je dois utiliser doit être à peu près auto-inclusif, en ce que ce qui est appelé ou référencé doit être dans le XSLT lui-même.

J'avais pensé à prendre la date et à l'heure et à la convertir en un numéro de série Julian et à gérer les mathématiques de date de la façon dont Excel le fait. Exemple -

09/14/2011 08:19:37 = 40800.346956018500000
09/15/2011 12:22:46 = 40801.515810185200000
difference 1 day 4 hours 3 minutes and 9 seconds
difference = 1.168854166666280

où tout ce qui reste de la décimale est à quelques jours, et tout à droite de la décimale est dans le temps (c'est-à-dire .168854166666280 * 24 = 4,0524999999990680, ou 4 heures et 0,0525 pour cent d'heure, ou 3,15 minutes).

Quelqu'un a-t-il déjà fait ce type de mathématiques de date écoulé dans XSLT 1.0 sans utiliser d'extensions?

J'apprécierais toute pensée, suggestions ou références s'il existe un ensemble de code existant que je peux réutiliser.

ÉDITER -

J'ai décidé de procéder à ce qui précède et j'ai frappé un accroc sur la conversion du temps.

L'exemple que j'utilise est: heure de début = 08:19:37 Heure de fin = 15:58:33

qui est une durée / différence de 7:38:56 (BTW, ce n'est que pour le calcul le jour même - je dois lancer une erreur si l'heure de début <si le jour est> 0).

Pour arriver à l'époque, je convertisse tout en quelques secondes, puis je fais le calcul. 08:19:37 Convertit en 29977 (8 * 3600 pendant des heures + 19 * 60 pour les minutes + secondes). 15:58:33 se convertit en 57513 (15 * 3600 pendant des heures + 58 * 60 pour les minutes + secondes).

La différence est de 27536 secondes.

Je comprends: 27536/3600 = 7.6488888888888888888 <- La partie entière est des heures alors la différence de 27536 - 25200 = 2336 <- la 25200 = 7 heures * 3600 secondes 2336/60 = 38,9333333333333333 <- Ensuite, la différence de 2336 - 2280 = 56 secondes d'en haut.

Cependant, si j'essaie de saisir la partie entière de ces nombres, il est soumis à l'arrondi.

<xsl:template name="time-difference">  
<xsl:param name="from-hour"/>  
<xsl:param name="from-minute"/>  
<xsl:param name="from-second"/>  
<xsl:param name="to-hour"/>  
<xsl:param name="to-minute"/>  
<xsl:param name="to-second"/>  
<xsl:variable name="f-secs" select="($from-hour * 3600) + ($from-minute * 60) + ($from-second)"/>  
<xsl:variable name="t-secs" select="($to-hour * 3600) + ($to-minute * 60) + ($to-   second)"/>  
<xsl:variable name="sec-diff" select="$t-secs - $f-secs"/>  
<xsl:variable name="daysec-diff" select="format-number(($sec-diff div 86400),'#')"/>  
<xsl:variable name="q" select="($sec-diff div 3600)"/>  
<xsl:variable name="t-hrs-diff" select="format-number(($sec-diff div 3600),'00')"/>  

La variable Q ci-dessus a 7,648888888888888888 (ce qui est correct) cependant, le T-HRS-DIFF une fois que le numéro de format se produit maintenant "08", ce qui rend mon temps incorrect.

Je sais que toute autre tentative de formatage pour saisir la partie entière du nombre entraînerait un arrondi.

En dehors du substratre avant & substratring-après - qui ferait (je pense) Faites-moi devoir convertir le résultat en un nombre avant d'utiliser dans le calcul suivant - y a-t-il un autre moyen de saisir la partie entière inchangée du nombre et de ne pas avoir à faire de la conversion d'une chaîne en nombre pour utiliser les pièces?

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top