Domanda

Utilizzando XSLT 1.0 e ricevi date nel seguente formato:

20111129060804

E ho bisogno di essere in grado di calcolare le differenze tra due di esse. Tuttavia, Non posso usare alcuna estensione.

Ho anche altre limitazioni:

  • Sono limitato agli spazi dei nomi che possono essere utilizzati all'interno di una XSLT,
  • E dove sto usando il foglio di stile XSL (un'applicazione di terze parti) non elaborerà correttamente alcuna azione di includere/importare all'interno dell'XSL.

Quindi, in effetti, l'XSLT che devo usare deve essere praticamente auto-inclusiva, in quanto qualunque cosa sia chiamata o referenziata deve essere nella stessa XSLT.

Avevo pensato di prendere la data e tempo e convertirlo in un numero di serie Julian e gestire la data matematica tanto come fa Excel. Esempio -

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

Laddove tutto è rimasto del decimale in giorni e tutto a destra del decimale è in tempo (cioè .168854166666280 * 24 = 4.05249999990680 o 4 ore e 0,0525 percento di un'ora o 3,15 minuti).

Qualcuno ha mai fatto questo tipo di matematica da data trascorso in XSLT 1.0 senza l'uso di estensioni?

Apprezzerei qualsiasi pensiero, suggerimenti o riferimenti se esiste un set di codice esistente che posso riutilizzare.

MODIFICARE -

Ho deciso di procedere con quanto sopra e ho colpito un ostacolo alla conversione del tempo.

L'esempio che sto usando è: ora di inizio = 08:19:37 Time di fine = 15:58:33

Che è una durata/differenza di 7:38:56 (btw, questo è solo per il calcolo dello stesso giorno - ho per lanciare un errore se il tempo di fine tempo <ora di inizio o se il giorno è> 0).

Per arrivare in quel momento, converto tutto in pochi secondi e poi faccio i conti. 08:19:37 Converte in 29977 (8 * 3600 per ore + 19 * 60 per minuti + secondi). 15:58:33 Converte in 57513 (15 * 3600 per ore + 58 * 60 per minuti + secondi).

La differenza è di 27536 secondi.

Ottengo: 27536/3600 = 7.648888888888888888 <- La parte intera è ore, quindi la differenza di 27536- 25200 = 2336 <- la parte 25200 = 7 ore * 3600 secondi 2336/60 = 38.93333333333333333. Quindi la differenza di 2336 - 2280 = 56 secondi dall'alto.

Tuttavia, se provo ad afferrare la parte intera di questi numeri, è soggetto a arrotondamento.

<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 variabile Q sopra ha 7.648888888888888888 (che è corretto) Tuttavia, il T-HRS-Diff una volta che il numero di formato si verifica ora ha "08", rendendo il mio tempo errato.

Conosco qualsiasi altro tentativo di formattazione di afferrare la parte intera del numero comporterebbe un arrotondamento.

Al di fuori del sottostring-prima & sottostring-dopo - quale sarebbe (Penso) Fammi dover convertire il risultato in un numero prima di utilizzare nel calcolo successivo - esiste un altro modo per afferrare la parte intera inalterata del numero e non devi fare la conversione da una stringa in numero per utilizzare i pezzi?

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top