2009-03-13 13 views
12

は、私はこのようなタイムスタンプを持つXML持っている:ティックをXSLTで読み込み可能な日時に変換する方法は?

<node stamp="1236888746689" /> 

をそして私は、時間と日付として結果をHTMLにそれらを表示したいと思います。 XSLT(任意のバージョン)でそれを行う方法はありますか?

編集: 私はSaxon9でXSLT2.0を使用しています。基本日付は1970-01-01 0:00です。

+0

技術的には可能ですが、非効率的で、入力をさらに必要とします(ゼロ時間の定義など)。私はこれをエクステンションに一括して渡します - あなたのプラットフォームは何ですか? – annakata

答えて

13

あなたは日付1970-01-01T00:00:00を取り、スタンプの値がわかりますできるだけ多くのミリ秒を追加します。あなたは、これは非自明であるEXSLT date and time functionsをサポートしていませんXSL 1.0プロセッサを使用したい場合は

<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

ノード内の属性を使用する代わりに、内部テキストを使用する答えをどのように変更しますか? – Broam

+0

@Broam ' 'で囲みます。 –

0

XSLTはTuring completeですので、方法が必要です。 :) XSLTの少なくとも少しを知って、それはおそらく再帰を伴います。

"ティック"の正確な解釈を指定していませんが、私は何時から何ミリ秒かを推測していますが、それは何ですか? 1970年?

1

しかし、それはされている。

Katy Coe's XSLT 1.0 implementation of the "iso-from-unix" functionをご覧ください。これは、彼女が作成した日時関数のかなり大きな「非商用利用のための無料の」セットの一部です。

ただし、この実装が機能するには、XSLプロセッサが"http://exslt.org/functions"名前空間をサポートしている必要があります。それ以外には、EXSLTに依存しません。

P .:私は、Unixのタイムスタンプとティックはであり、正確にはではないことを認識しています。彼らは十分に近いです。

8

あなたがEXSLT date functionsをサポートXSLT 1.0プロセッサを(私はPHPでlibxsltでこれをテストしてみた)を使用している場合は、date:add()date:duration()を使用することができます。

​​

date:duration()関数は数を取ります秒(ミリ秒を1000で割る必要があります)を "duration"(この場合は "P14315DT20H12M26.6889998912811S")に変えてから、エポックの開始に追加します(このエフェクトの標準エポックのように見えます) )をdate:add()に設定して、「2009-03-12T20:12:26.6889998912811Z」のスタンプを取得します。必要なものに応じて、EXSLTの日付関数またはsubstring()を使用してフォーマットすることができます。

4

私はここで探していたものを見つけることができませんでしたので、私は私の解決策でそれを支払うと思いました。

私のXMLは、export_nodeとdrushを使用して、Drupalからダンプされた少数のノードでした。私はxslt 1.0しかサポートしていないPHP5でxsltプロセッサを使用していました。一部のEXSLT関数はサポートされているように見えますが、構文が間違っているのか、使用しようとしていた関数がサポートされていないのか分からないのです。とにかく、次のことが私のために働いた。 w3schoolsのサンプルコードを使用しました。以下のようにxsltprocessorを宣言した直後に行を追加しました。

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

PHPには日付変換のための機能がほとんどないので、私はPHPプロセッサを不正に使用していました。私はすでにそれを使ってxslを変換していたからです。

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

これが誰かを助けてくれることを願っています。私はこの仕事をしながらかなり長い間頭を叩いていました。

+1

私はまた、これを使う必要があることを知った: '' – kenny

関連する問題