我是xslt的新手。我在 xml 中有两个输入作为 输入 1 是日期时间格式的开始日期 - 2012-12-26T00:00:00 输入 2 是保修整数格式的月份 — 12 个月 我希望输出为日期时间格式的结束日期,该格式将是开始日期+保修月份。
请求:
<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/。您可以在 http://exslt.org/date/functions/add/date.add.template.xsl 下载此库的实现,并将其包含在项目中,或者提取所需的位。名为 date:add 的模板应该可以满足您的需求。