doukeyong3746487 2016-12-04 13:09
浏览 43

如何在XSLT 1.0中编写GMTIME代码 - 程序与函数编程

Using XSLT 1.0 with NO EXTENSIONS so a browser would be able to transform xml by using an associated xsl file.

I was wondering if it's possible to transform a Unix-timestamp (1480873681) into a date-array as done by the gmtime_r function (PHP 7 example):

CONST _lpdays = [-1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];
CONST _days = [-1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364];

function gmtime_r(int $timestamp): array
{
    $isleapyear = false;
    $tmptimer = (int) ($timestamp / _FOUR_YEAR_SEC);
    $timer = $timestamp - ($tmptimer * _FOUR_YEAR_SEC);
    $tmptimer = ($tmptimer * 4) + 70;
    if ($timer >= _YEAR_SEC) {
        $tmptimer = $tmptimer + 1;
        $timer = $timer - _YEAR_SEC;
        if ($timer >= _YEAR_SEC) {
            $tmptimer = $tmptimer + 1;
            $timer = $timer - _YEAR_SEC;
            if ($timer >= (_YEAR_SEC + _DAY_SEC)) {
                $tmptimer = $tmptimer + 1;
                $timer = $timer - (_YEAR_SEC + _DAY_SEC);
            } else {
                $isleapyear = true; 
            }
        }
    }
    $ptm['year'] = $tmptimer;
    $ptm['yday'] = (int) ($timer / _DAY_SEC);
    $timer = $timer - ($ptm['yday'] * _DAY_SEC);
    if ($isleapyear) {
        $mdays = _lpdays;
    }
    else {
        $mdays = _days;
    }
    for ($tmptimer = 1; $mdays[$tmptimer] < $ptm['yday']; $tmptimer++);
    $tmptimer = $tmptimer - 1;
    $ptm['mon'] = $tmptimer;
    $ptm['mday'] = $ptm['yday'] - $mdays[$tmptimer];
    $ptm['wday'] = ((int) ($timestamp / _DAY_SEC) + _BASE_DOW) % 7;
    $ptm['hours'] = (int) ($timer / _HOUR_SEC);
    $timer = $timer - ($ptm['hours'] * _HOUR_SEC);
    $ptm['minutes'] = (int) ($timer / _MIN_SEC);
    $ptm['seconds'] = ($timer - $ptm['minutes'] * _MIN_SEC);
//    $ptm['isdst'] = 0;
    return $ptm;
}

I replaced the array by a more xsl-style structure:

<my:mmonth>
    <d l="0">-1</d><d l="0">30</d><d l="0">59</d><d l="0">90</d><d l="0">120</d><d l="0">151</d><d l="0">181</d><d l="0">212</d><d l="0">243</d><d l="0">273</d><d l="0">304</d><d l="0">334</d><d l="0">365</d>
    <d l="1">-1</d><d l="1">30</d><d l="1">58</d><d l="1">89</d><d l="1">119</d><d l="1">150</d><d l="1">180</d><d l="1">211</d><d l="1">242</d><d l="1">272</d><d l="1">303</d><d l="1">333</d><d l="1">364</d>
</my:mmonth>

so the for-loop could be replaced by

<xsl:variable name="mon" select="count(document('')/xsl:stylesheet/my:mmonth/d[(@l=$isleapyear) and (. &lt; $yday)]) - 1"/>
<xsl:variable name="mday" select="$yday - (document('')/xsl:stylesheet/my:mmonth/d[(@l=$isleapyear)][$mon])"/>

Because of the rigid variable-scope of XSLT the nested if-structure gives me a headache...

if ($timer >= _YEAR_SEC) {
    $tmptimer = $tmptimer + 1;
    $timer = $timer - _YEAR_SEC;
    if ($timer >= (_YEAR_SEC + _DAY_SEC)) {
        $tmptimer = $tmptimer + 1;
        $timer = $timer - (_YEAR_SEC + _DAY_SEC);
    } else {
        $isleapyear = true; 
    }
}

Any help would be appreciated!

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 多址通信方式的抗噪声性能和系统容量对比
    • ¥15 winform的chart曲线生成时有凸起
    • ¥15 msix packaging tool打包问题
    • ¥15 finalshell节点的搭建代码和那个端口代码教程
    • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
    • ¥15 Centos / PETSc / PETGEM
    • ¥15 centos7.9 IPv6端口telnet和端口监控问题
    • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
    • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
    • ¥20 海浪数据 南海地区海况数据,波浪数据