これは、同様の名前を持つ他の質問とほとんど同じですが、代わりに回答を XSLT1.0 に限定してください。属性も削除しています。これを簡単にします。さらに、このタイムスタンプは 3 桁短くなっています。
次のようなタイムスタンプを持つ XML があります。
<node><stamp>1236888746</stamp></node>
<node><stamp>1360954731</stamp></node>
そして、それらを結果HTMLに日付と時刻として表示したいと思います。ブラウザで実行される XSLT でそれを行う方法はありますか?
編集:これは意図したとおりに機能しません。数学の問題のようです。うるうとは、1970 年 2 月 29 日の直後から始まる 4 年です。私が提示した計算では、間違った結果が生成されます。私が xPath でテストした月数の部分では、bools は 0 または 1 であり、以下のようにそれらを合計すると整数の結果が生成されます。
<xsl:variable name="leapoffset" select="31 + 29"/>
<xsl:variable name="leapdays" select="31 * 4 * 7 + 30 * 4 * 4 + 28 * 4 + 1"/>
<!-- Enter loop -->
<xsl:variable name="days" select="round(stamp div 86400 - 0.5)"/>
<xsl:variable name="leaps" select="round(($days - $leapoffset) div $leapdays + $leapoffset div $leapdays - 0.5)"/>
<xsl:variable name="dayofleap" select="$days - $leaps * $leapdays + $leapoffset - 1"/>
<xsl:variable name="tmp" select="0 +
($dayofleap > 31) * 31745 +
($dayofleap > 61) * 30721 +
($dayofleap > 92) * 31745 +
($dayofleap > 122) * 30721 +
($dayofleap > 153) * 31745 +
($dayofleap > 184) * 31745 +
($dayofleap > 214) * 30721 +
($dayofleap > 245) * 31745 +
($dayofleap > 275) * 30721 +
($dayofleap > 306) * 31745 +
($dayofleap > 337) * 31745 +
($dayofleap > 365) * 28673 +
($dayofleap > 396) * 31745 +
($dayofleap > 426) * 30721 +
($dayofleap > 457) * 31745 +
($dayofleap > 487) * 30721 +
($dayofleap > 518) * 31745 +
($dayofleap > 549) * 31745 +
($dayofleap > 579) * 30721 +
($dayofleap > 610) * 31745 +
($dayofleap > 640) * 30721 +
($dayofleap > 671) * 31745 +
($dayofleap > 702) * 31745 +
($dayofleap > 730) * 28673 +
($dayofleap > 761) * 31745 +
($dayofleap > 791) * 30721 +
($dayofleap > 822) * 31745 +
($dayofleap > 852) * 30721 +
($dayofleap > 883) * 31745 +
($dayofleap > 914) * 31745 +
($dayofleap > 944) * 30721 +
($dayofleap > 975) * 31745 +
($dayofleap > 1005) * 30721 +
($dayofleap > 1036) * 31745 +
($dayofleap > 1067) * 31745 +
($dayofleap > 1095) * 28673 +
($dayofleap > 1126) * 31745 +
($dayofleap > 1156) * 30721 +
($dayofleap > 1187) * 31745 +
($dayofleap > 1217) * 30721 +
($dayofleap > 1248) * 31745 +
($dayofleap > 1279) * 31745 +
($dayofleap > 1309) * 30721 +
($dayofleap > 1340) * 31745 +
($dayofleap > 1370) * 30721 +
($dayofleap > 1401) * 31745 +
($dayofleap > 1432) * 31745 +
($dayofleap > 1461) * 29697
"/>
<xsl:variable name="monthofleap" select="($tmp mod 1024) + 2"/>
<xsl:variable name="day" select="$dayofleap - round($tmp div 1024 - 0.5)"/>
<xsl:variable name="yearofleap" select="round($monthofleap div 12 - 0.5)"/>
<xsl:variable name="years" select="$leaps * 4 + $yearofleap"/>
<xsl:variable name="month" select="$monthofleap mod 12"/>
<xsl:value-of select="$years + 1970"
/>-<xsl:value-of select="format-number($month, '00')"
/>-<xsl:value-of select="format-number($day, '00')"
/>T<xsl:value-of select="format-number(round(stamp div 3600 - 0.5) mod 24, '00')"
/>:<xsl:value-of select="format-number(round(stamp div 60 - 0.5) mod 60, '00')"
/>:<xsl:value-of select="format-number(stamp mod 60, '00')"/>
コード内のコメントが好きではないので、1 行ずつ説明させてください。実際、コメントはまったく好きではありません。たとえば、これらは上記のコードを正確に反映していません。私は、コードが書かれている言語以外の言語でコードを説明するのは得意ではありません。上記のコードを読んだからではなく、私の説明によって、私がやろうとしていることを理解できるなら、それは良いことです。あなたが私を助けてくれるとしたら、驚くでしょう。最初の 2 つはグローバル定数で、エポックから 2 月 29 日までの日数と 4 年間の日数です。ティックを日に変換します。エポックからの閏日を数えてみてください。最後の 2 月 29 日からの日数。うるうの開始から月の境界ごとに 1 を加算してカウントし、48 か月の長い式をうるうで変化させると、48 個のブール値が存在します。上位ビットは、現在の月に属さない他の月に経過した日数を格納/カウントするために使用されます。この飛躍の 2 か月前 (1 月 1 日) から経過した年数を表す数値 (0 から 5)。エポックからの年数。この飛躍の 2 か月前 (1 月 1 日) から経過した月数を表す数値。