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 的模板应该可以满足您的需求。
我是 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 的模板应该可以满足您的需求。