这与其他具有类似名称的问题非常相似,但却限制了XSLT1.0的答案。我也删除了属性,让这很容易。加上这个时间戳缩短了3位数。
我有一个带有这样的时间戳的XML:
<node><stamp>1236888746</stamp></node>
<node><stamp>1360954731</stamp></node>
我想在结果HTML中将它们显示为时间日期。有没有办法在浏览器上运行XSLT呢?
编辑: 这不符合预期,似乎是一个数学问题。飞跃是四年,从1970年2月29日开始,如果你必须的话。我列出的数学结果不正确。我在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')"/>
让我逐行解释,因为我不喜欢代码中的注释。实际上我根本不喜欢评论,这些并不完全反映上面的代码。我不擅长用代码编写的任何其他语言来解释代码,这很好,因为如果你能理解我正在尝试做什么因为我的解释而不是因为你读了上面的代码然后我'如果你对我有所帮助,我会感到惊讶。前两个是全局常数,从大纪元到2月29日的天数以及四年中的天数。将刻度转换为天数。试着弄清楚自大纪元以来有多少闰日。自去年2月29日以来多少天。计算自飞跃开始以来的月份,为每个月边界添加一个月,在一个跳跃中改变48个月的长方程,因此有48个bool,高阶位用于存储/计算其他月份已经过的天数不属于当月。一个数字(0到5),表示在此跳跃之前2个月(1月1日)过去的年数。大纪元以来的年数。一个数字,表示在此跳跃之前2个月(1月1日)过去的月数。