1

这与具有相似名称的其他问题非常相似,但是将答案限制为 XSLT1.0。我也删除了属性,让它变得简单。加上这个时间戳短了 3 位数字。

我有一个带有这样时间戳的 XML:

<node><stamp>1236888746</stamp></node>
<node><stamp>1360954731</stamp></node>

我想在结果 HTML 中将它们显示为日期和时间。有没有办法在浏览器上运行 XSLT?

编辑:这不按预期工作,似乎是一个数学问题。一个飞跃是四年,如果必须的话,从 1970 年 2 月 29 日之后开始。我列出的数学产生了不正确的结果。我在 xPath 中测试过的月数部分,布尔值是 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')"/>

让我逐行解释,因为我不喜欢代码中的注释。实际上我根本不喜欢评论,例如,这些并不能准确地反映上面的代码。我不擅长用任何其他语言解释代码,然后是编写代码的语言,这很好,因为如果你能理解我正在尝试做的事情,因为我的解释而不是因为你阅读了上面的代码,那么我如果你对我有帮助,我会感到惊讶。前两个是全局常数,从 Epoch 到 2 月 29 日的天数和四年的天数。将刻度转换为天。尝试计算自纪元以来有多少闰日。自上次 2 月 29 日以来的天数。计算自飞跃开始以来的月份,每个月边界加一个,在飞跃中改变长方程 48 个月,因此有 48 个布尔值,高阶位用于存储/计算不属于当前月份的其他月份已过去的天数。一个数字(0 到 5),表示自此次飞跃前 2 个月(1 月 1 日)以来经过的年数。自纪元以来的年数。一个数字,表示自此次飞跃前 2 个月(1 月 1 日)以来经过的月数。

4

0 回答 0