1

これは、同様の名前を持つ他の質問とほとんど同じですが、代わりに回答を 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 &gt; 31) * 31745 +
($dayofleap &gt; 61) * 30721 +
($dayofleap &gt; 92) * 31745 +
($dayofleap &gt; 122) * 30721 +
($dayofleap &gt; 153) * 31745 +
($dayofleap &gt; 184) * 31745 +
($dayofleap &gt; 214) * 30721 +
($dayofleap &gt; 245) * 31745 +
($dayofleap &gt; 275) * 30721 +
($dayofleap &gt; 306) * 31745 +
($dayofleap &gt; 337) * 31745 +
($dayofleap &gt; 365) * 28673 +
($dayofleap &gt; 396) * 31745 +
($dayofleap &gt; 426) * 30721 +
($dayofleap &gt; 457) * 31745 +
($dayofleap &gt; 487) * 30721 +
($dayofleap &gt; 518) * 31745 +
($dayofleap &gt; 549) * 31745 +
($dayofleap &gt; 579) * 30721 +
($dayofleap &gt; 610) * 31745 +
($dayofleap &gt; 640) * 30721 +
($dayofleap &gt; 671) * 31745 +
($dayofleap &gt; 702) * 31745 +
($dayofleap &gt; 730) * 28673 +
($dayofleap &gt; 761) * 31745 +
($dayofleap &gt; 791) * 30721 +
($dayofleap &gt; 822) * 31745 +
($dayofleap &gt; 852) * 30721 +
($dayofleap &gt; 883) * 31745 +
($dayofleap &gt; 914) * 31745 +
($dayofleap &gt; 944) * 30721 +
($dayofleap &gt; 975) * 31745 +
($dayofleap &gt; 1005) * 30721 +
($dayofleap &gt; 1036) * 31745 +
($dayofleap &gt; 1067) * 31745 +
($dayofleap &gt; 1095) * 28673 +
($dayofleap &gt; 1126) * 31745 +
($dayofleap &gt; 1156) * 30721 +
($dayofleap &gt; 1187) * 31745 +
($dayofleap &gt; 1217) * 30721 +
($dayofleap &gt; 1248) * 31745 +
($dayofleap &gt; 1279) * 31745 +
($dayofleap &gt; 1309) * 30721 +
($dayofleap &gt; 1340) * 31745 +
($dayofleap &gt; 1370) * 30721 +
($dayofleap &gt; 1401) * 31745 +
($dayofleap &gt; 1432) * 31745 +
($dayofleap &gt; 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 日) から経過した月数を表す数値。

4

0 に答える 0