XSLT 中一个月或一年的最后一天

Nic*_*ado 1 xml oracle xslt xquery bpel

我在 Oracle Bpel 中进行转换时遇到一些问题 我收到一个日期和一个组标准:mm/yyyy 或:yyyy。

所以,我必须用我收到的日期构建一个“开始日期”和一个“结束日期”。

如果标准是 mm/yyyy,则开始日期将是给定月/年的第一天,结束日期将是给定月/年的最后一天。

我知道有一个函数叫做:functx:last-day-of-month

但是我无法在 Oracle Bpel 中完成这项工作,所以这就是我使用这个答案的原因:XSLT 中上个月的最后一天 只想知道如何在任何给定月份执行此操作。

示例:对于给定日期:2012-10-20T20:18:33

我应该返回日期:

开始日期:2012-10-01

结束日期:2012-10-31

非常感谢您的帮助。

mic*_*57k 5

如果您的处理器仅支持 XSLT 1.0,您可以通过调用以下命名模板来确定任何给定日期的最后一天:

<xsl:template name="last-day-of-month">
    <xsl:param name="date"/>
    <xsl:param name="y" select="substring($date, 1, 4)"/>
    <xsl:param name="m" select="substring($date, 6, 2)"/>
    <xsl:param name="cal" select="'312831303130313130313031'"/>
    <xsl:param name="leap" select="not($y mod 4) and $y mod 100 or not($y mod 400)"/>
    <xsl:param name="month-length" select="substring($cal, 2*($m - 1) + 1, 2) + ($m=2 and $leap)" />
    <xsl:value-of select="concat($y, '-', $m, '-', $month-length)" />
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

示例调用:

<output>
    <xsl:call-template name="last-day-of-month">
        <xsl:with-param name="date">2012-10-20T20:18:33</xsl:with-param>
    </xsl:call-template>
</output>
Run Code Online (Sandbox Code Playgroud)

返回:

<output>2012-10-31</output>      
Run Code Online (Sandbox Code Playgroud)

示例调用:

<output>
    <xsl:call-template name="last-day-of-month">
        <xsl:with-param name="date">2012-02-15</xsl:with-param>
    </xsl:call-template>
</output>
Run Code Online (Sandbox Code Playgroud)

返回:

<output>2012-02-29</output>
Run Code Online (Sandbox Code Playgroud)

添加:

为了完成,在XSLT 2.0 中,您可以执行以下操作:

xs:date($given-date) - xs:dayTimeDuration(concat('P', day-from-date($given-date) - 1, 'D')) + xs:yearMonthDuration('P1M') - xs:dayTimeDuration('P1D')
Run Code Online (Sandbox Code Playgroud)