使用xslt 1.0进行时间转换

时间:2015-05-19 17:33:35

标签: xslt-1.0

我的XML包含时间为字符串//

Wed Apr 22 02:49:26 2015

我需要从当前时间减去此时间并在xslt上显示为<sample> <time>Wed Apr 22 02:49:26 2015</time> </sample>

有办法做到这一点吗?感谢您能否帮助我

1 个答案:

答案 0 :(得分:0)

XSLT 1.0没有日期或时间的概念,所以这很难。即使获取当前日期或时间本身也存在问题 - 尽管大多数XSLT 1.0处理器都支持用于此目的的扩展功能。

更优雅的解决方案可能是编写自己的扩展函数(使用Java)来完成此任务 - 请参阅:https://xml.apache.org/xalan-j/extensions.html#ext-functions

这里我将展示如何在XSLT 1.0中完全执行此操作(获取当前日期和时间除外 - 它也可以在运行时作为参数传递给样式表)。

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
extension-element-prefixes="date">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/sample">
    <duration>
        <xsl:call-template name="elapsed-time">
            <xsl:with-param name="start" select="time" />
        </xsl:call-template>    
    </duration>
</xsl:template>

<xsl:template name="elapsed-time">
    <xsl:param name="start"/>

    <xsl:variable name="mmm" select="substring($start, 5, 3)" />

    <xsl:variable name="JDN1">
        <xsl:call-template name="JDN">
            <xsl:with-param name="month" select="string-length(substring-before('JanFebMarAprMayJunJulAugSepOctNovDec', $mmm)) div 3 + 1" />
            <xsl:with-param name="day" select="substring($start, 9, 2)" />
            <xsl:with-param name="year" select="substring($start, 21, 4)" />
            <xsl:with-param name="hour" select="substring($start, 12, 2)" />
            <xsl:with-param name="minute" select="substring($start, 15, 2)" />
            <xsl:with-param name="second" select="substring($start, 18, 2)" />
        </xsl:call-template>
    </xsl:variable>

    <xsl:variable name="today" select="date:date()" />
    <xsl:variable name="now" select="date:time()" />

    <xsl:variable name="JDN2">
        <xsl:call-template name="JDN">
            <xsl:with-param name="year" select="substring($today, 1, 4)" />
            <xsl:with-param name="month" select="substring($today, 6, 2)" />
            <xsl:with-param name="day" select="substring($today, 9, 2)" />
            <xsl:with-param name="hour" select="substring($now, 1, 2)" />
            <xsl:with-param name="minute" select="substring($now, 4, 2)" />
            <xsl:with-param name="second" select="substring($now, 7, 2)" />
        </xsl:call-template>
    </xsl:variable>

    <xsl:variable name="seconds" select="$JDN2 - $JDN1"/>
    <xsl:variable name="h" select="floor($seconds div 3600)"/>
    <xsl:variable name="r" select="$seconds mod 3600"/>
    <xsl:variable name="m" select="floor($r div 60)"/>
    <xsl:variable name="s" select="$r mod 60"/>

    <xsl:value-of select="concat($h, format-number($m, ':00'), format-number($s, ':00'))"/>
</xsl:template> 

<xsl:template name="JDN">
    <xsl:param name="year"/>
    <xsl:param name="month"/>
    <xsl:param name="day"/>
    <xsl:param name="hour"/>
    <xsl:param name="minute"/>
    <xsl:param name="second"/>

    <xsl:variable name="a" select="floor((14 - $month) div 12)"/>
    <xsl:variable name="y" select="$year + 4800 - $a"/>
    <xsl:variable name="m" select="$month + 12*$a - 3"/>    
    <xsl:variable name="jd" select="$day + floor((153*$m + 2) div 5) + 365*$y + floor($y div 4) - floor($y div 100) + floor($y div 400) - 32045" />

    <xsl:value-of select="86400*$jd + 3600*$hour + 60*$minute + $second" />
</xsl:template> 

</xsl:stylesheet>

如果以上内容适用于2015-05-21 11:51:48的示例输入,结果将为:

<?xml version="1.0" encoding="UTF-8"?>
<duration>705:02:22</duration>

注意:假设您的输入日期格式使用2位数字作为日期部分;否则你将需要使用不同的方法来解析它。