Xslt 1.0:将months(integer)添加到日期时间格式

时间:2019-12-11 01:48:28

标签: datetime xslt xslt-1.0

我是xslt的新手。我在xml中有两个输入 输入1是日期时间格式的startDate -2012-12-26T00:00:00 输入2是保修月,以整数格式表示-12个月 我希望输出为dateTime格式的endDate,它将是startDate + warrantyMonths。

请求:

 <ass:FinancialInfo xmlns:ass="******">
        <ass:name>Test</ass:name>
        <ass:warrantyMonths>12</ass:warrantyMonths>
        <ass:startDate>2012-12-26T00:00:00</ass:startDate>
  </ass:FinancialInfo>

我如何在xslt 1.0中做到这一点。

预先感谢

2 个答案:

答案 0 :(得分:2)

在XSLT 1.0中很难做到这一点。尝试这种方式:

<xsl:template name="add-months-to-dateTime">
    <xsl:param name="dateTime"/>
    <xsl:param name="months-to-add"/>
    <!-- extract components -->
    <xsl:variable name="year" select="substring($dateTime, 1, 4)"/>
    <xsl:variable name="month" select="substring($dateTime, 6, 2)"/>
    <xsl:variable name="day" select="substring($dateTime, 9, 2)"/>
    <xsl:variable name="time" select="substring-after($dateTime, 'T')"/>
    <!-- calculate target year and month (using Knuth's corrected mod) -->
    <xsl:variable name="m11" select="$month + $months-to-add - 1"/>
    <xsl:variable name="y" select="$year + floor($m11 div 12)"/>
    <xsl:variable name="m" select="$m11 - 12 * floor($m11 div 12) + 1"/>
    <!-- calculate target day (clipped to last day of target month, excess days do not overflow) -->
    <xsl:variable name="cal" select="'312831303130313130313031'"/>
    <xsl:variable name="leap" select="not($y mod 4) and $y mod 100 or not($y mod 400)"/>
    <xsl:variable name="month-length" select="substring($cal, 2 * ($m - 1) + 1, 2) + ($m = 2 and $leap)" /> 
    <xsl:variable name="d">
        <xsl:choose>
            <xsl:when test="$day > $month-length">
                <xsl:value-of select="$month-length"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$day"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <!-- output -->
    <xsl:value-of select="$y"/>
    <xsl:value-of select="format-number($m, '-00')"/>
    <xsl:value-of select="format-number($d, '-00')"/>
    <xsl:text>T</xsl:text>
    <xsl:value-of select="$time"/>
</xsl:template>

通话示例:

<xsl:template match="ass:FinancialInfo">
    <xsl:copy>
        <xsl:copy-of select="*"/>
        <ass:endDate>
            <xsl:call-template name="add-months-to-dateTime">
                <xsl:with-param name="dateTime" select="ass:startDate"/>
                <xsl:with-param name="months-to-add" select="ass:warrantyMonths"/>
            </xsl:call-template>
        </ass:endDate>
    </xsl:copy>
</xsl:template> 

答案 1 :(得分:0)

如果无法升级到XSLT 2.0,请考虑是否可以使用EXSLT日期和时间模块的实现,请参见http://exslt.org/date/。您可以在http://exslt.org/date/functions/add/date.add.template.xsl下载该库的实现,然后将其包含在项目中,或者提取所需的位。名为date:add的模板应该可以满足您的需求。