我是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中做到这一点。
预先感谢
答案 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的模板应该可以满足您的需求。