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