Xslt 1.0:将月份(整数)添加到日期时间格式

Xslt 1.0 : add months(integer) to date time format

我是 xslt 新手。我在 xml 中有两个输入 输入 1 是日期时间格式的开始日期—2012-12-26T00:00:00 输入 2 是整数格式的 warrantyMonths —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 中执行此操作。

提前致谢

这在 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> 

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