2009-03-13 5 views
12

Ich habe eine XML mit Zeitstempel wie folgt aus:Wie konvertiert man Ticks in eine lesbare Datetime mit XSLT?

<node stamp="1236888746689" /> 

Und ich möchte sie im Ergebnis HTML als Datum mit Uhrzeit anzuzeigen. Gibt es eine Möglichkeit, dies mit XSLT (jeder Version) zu tun?

EDIT: Ich benutze XSLT2.0 mit Saxon9. Das Basisdatum ist 1970-01-01 0:00.

+0

Technisch möglich, aber ineffizient und erfordern weitere Eingaben (wie eine Definition der Nullzeit). Ich würde dies auf eine Erweiterung verteilen - was ist Ihre Plattform? – annakata

Antwort

13

Sie nehmen das Datum 1970-01-01T00:00:00 und fügen Sie so viele Millisekunden als der Wert des Stempels Sie sagt:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://www.w3.org/TR/xhtml1/strict"> 

    <xsl:template match="node"> 
     <xsl:value-of 
select='xs:dateTime("1970-01-01T00:00:00") + @stamp * xs:dayTimeDuration("PT0.001S")'/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Wie würde man die Antwort ändern, um den inneren Text in einem Knoten anstelle eines Attributs zu verwenden? – Broam

+0

@Broam Wickle die ' '. –

0

XSLT ist Turing complete, also muss es einen Weg geben. :) Wenn mindestens ein bisschen XSLT bekannt ist, wird es wahrscheinlich eine Rekursion beinhalten.

Sie geben nicht die genaue Interpretation Ihrer "Ticks" an, ich vermute Millisekunden seit irgendeiner Epoche, aber welche? 1970?

1

Wenn Sie eine XSL-1.0-Prozessor verwenden wollte, die nicht die EXSLT date and time functions unterstützt dies ist nicht trivial aber es ist getan worden.

Sie können sich Katy Coe's XSLT 1.0 implementation of the "iso-from-unix" function ansehen. Es ist Teil eines ziemlich großen "frei für nicht-kommerzielle Nutzung" Set von Datum und Uhrzeit Funktionen, die sie erstellt.

Ihr XSL-Prozessor muss jedoch den "http://exslt.org/functions"-Namespace unterstützen, damit diese Implementierung funktioniert. Ansonsten besteht keine Abhängigkeit von EXSLT.

S.S .: Ich bin mir bewusst, dass ein Unix-Zeitstempel und Ticks nicht genau die gleiche Sache sind. Sie sind nahe genug.

8

Wenn Sie einen XSLT 1.0 Prozessor verwenden, die die EXSLT date functions unterstützt (Ich habe das gerade getestet mit libxslt in PHP), können Sie date:add() und date:duration() verwenden:

<xsl:value-of select="date:add('1970-01-01T00:00:00Z', date:duration(@stamp div 1000))"/> 

Die date:duration() Funktion nimmt eine Reihe von Sekunden (also müssen Sie Ihre Millisekunden durch 1000 teilen) und verwandelt es in eine "Dauer" (in diesem Fall "P14315DT20H12M26.6889998912811S"), die dann zum Beginn Ihrer Epoche hinzugefügt wird (sieht für diese Marke wie die Standardepoche aus)) mit date:add(), um eine Marke von "2009-03-12T20:12:26.6889998912811Z" zu bekommen. Sie können dies dann mit den EXSLT-Datumsfunktionen oder nur substring() formatieren, je nachdem, was Sie benötigen.

4

Verspätete Antwort, ja, ich weiß, aber ich konnte nicht die finden, die ich hier suchte, also dachte ich, ich würde es mit meiner Lösung bezahlen.

Meine XML war ein paar Knoten von Drupal mit export_node und drush. Ich benutzte den XSLT-Prozessor in PHP5, der nur xslt 1.0 unterstützt. Einige EXSLT-Funktionen scheinen unterstützt zu werden, aber ich konnte nicht feststellen, ob meine Syntax falsch war oder die Funktion, die ich verwenden wollte, nicht unterstützt wurde. Wie auch immer, das Folgende funktionierte für mich. Ich habe den Beispielcode von w3schools verwendet.com, fügte aber direkt nach der Deklaration des xsltprocessor eine Zeile hinzu:

$ xp = new XsltProcessor();
$ xp-> registerPHPFunctions();

PHP hat eine triviale Funktion für die Datumsumwandlung, also habe ich den PHP-Prozessor betrogen und benutzt, da ich ihn bereits benutzt habe, um meine xsl zu transformieren.

<xsl:for-each select="node_export/node"> 
    <xsl:value-of select="php:function('date', 'n-j-y', number(timestamp))"/> 
</xsl:for-each> 

Hoffe das hilft jemand da draußen. Ich schlug mir eine ganze Weile lang den Kopf, als ich diesen hier herausarbeitete.

+1

Ich fand auch, dass ich dies verwenden musste: '' – kenny