gpt4 book ai didi

xslt - 如何将 5 个工作日添加到现有值 xslt

转载 作者:行者123 更新时间:2023-12-02 01:58:50 25 4
gpt4 key购买 nike

我有一个名为“DateSet”的字符串,其值为“16/10/2008”。我想为该值增加 5 个工作日。我假设我必须将值转换为某个值,以便它知道这是一个日期。

我正在使用 xslt 1.0,并使用自定义软件将 xslt 转换为 Word 文档。
现在它显示:

<w:p>
<w:r>
<w:t>Some text [DateSet]</w:t>
</w:r>
</w:p>

[DateSet] 16/10/2008

但我希望它显示的是:
<w:p>
<w:r>
<w:t>Some text [DateSet+5business days]</w:t>
</w:r>
</w:p>

[DateSet+5business days] 应该在哪里显示 23/10/2008

我是否需要使用 ms:format-date 并以某种方式转换它?

最佳答案

根据您的描述,听起来好像您已将日期字符串从上下文中分离出来,以便您可以使用它并将其替换为新日期。好的。如果这不是真的,那么你的第一个问题就是让它成为真的。

扩展函数 ms:format-date() 或许可以帮到你,不过看一眼 its documentation我不明白怎么办

给定一个日期,我认为在 XSLT 1.0 中执行您需要的日期算术的最简单方法是:

  • 将日期转换为整数(例如儒略日数)。
  • 执行日期算术。
  • 将结果整数转换为日期。

  • 要将日期转换为整数,可以使用以下模板;它基于 Robert G. Tantzen,“算法 199:日历日期和儒略日数字之间的转换”CACM 6.8(1963 年 8 月):444。它要求您从日期字符串中解析出年、月和日数字并通过它们在一个参数中。
    <xsl:template name="jday">
    <!--* JDay: convert a triple of integers representing
    * Gregorian year, month, and day numbers to the
    * number of the Julian day beginning at noon on that
    * date.
    * Transcribed from Robert G. Tantzen, "Algorithm
    * 199: Conversions between calendar date and Julian
    * day number" CACM 6.8 (Aug 1963): 444.
    *-->
    <xsl:param name="year" select="1963"/>
    <xsl:param name="month" select="08"/>
    <xsl:param name="day" select="13"/>

    <xsl:variable name="y">
    <xsl:choose>
    <xsl:when test="$month > 2">
    <xsl:value-of select="$year"/>
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="$year - 1"/>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:variable>
    <xsl:variable name="m">
    <xsl:choose>
    <xsl:when test="$month > 2">
    <xsl:value-of select="$month - 3"/>
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="$month + 9"/>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:variable>
    <xsl:variable name="d" select="$day"/>
    <xsl:variable name="c" select="floor($y div 100)"/>
    <xsl:variable name="ya" select="$y - 100 * $c"/>

    <!--* H holds the offset between Julian day 0
    * and the beginning of the common era.
    *-->
    <xsl:variable name="H" select="1721119"/>
    <!--* Calculate the Julian day that begins on the
    * given date.
    *-->
    <xsl:value-of select="floor(($c * 146097) div 4)
    + floor(($ya * 1461) div 4)
    + floor((($m * 153) + 2) div 5)
    + $d
    + $H"/>

    </xsl:template>

    执行日期算术可能有点棘手:对于工作日,五个工作日后的日期是(我猜)七个日历日后,除非在该期间发生假期。对于周末,我想五个工作日后的日期是下一个星期五。给定儒略日数 $j,您可以通过计算 $j mod 7 来获得星期几:0 = 星期一,1 = 星期二,...,6 = 星期日。所以你的计算可能看起来像
    <xsl:choose>
    <xsl:when test="$j mod 7 = 5">
    <xsl:value-of select="$j + 6"/>
    </xsl:when>
    <xsl:when test="$j mod 7 = 6">
    <xsl:value-of select="$j + 5"/>
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="$j + 7"/>
    </xsl:otherwise>
    </xsl:choose>

    对于假期,您将不得不查阅一些您感兴趣的时期的外部信息来源;祝你好运。

    可以使用以下模板将结果日期数转换回日历日期,再次转录自 Tantzen 1963:
    <xsl:template name="jdate">
    <!--* JDate: given a Julian day number, return an ISO
    * 8601 date.
    * Transcribed from Robert G. Tantzen, "Algorithm
    * 199: Conversions between calendar date and Julian
    * day number" CACM 6.8 (Aug 1963): 444.
    *-->
    <xsl:param name="j" select="2438255"/>

    <!--* dce: days in the common era (i.e. since
    * 0000-03-01; Tantzen uses 1 Mar, not 1 Jan,
    * as his epoch to simplify calculations). *-->
    <xsl:variable name="dce" select="$j - 1721119"/>

    <!--* cce: full centuries in the common era. *-->
    <xsl:variable name="cce"
    select="floor((4 * $dce - 1) div 146097)"/>

    <!--* dcc4: days in current century, times 4. *-->
    <xsl:variable name="dcc4"
    select="(4 * $dce - 1) - (146097 * $cce)"/>

    <!--* dcc: days in current century. *-->
    <xsl:variable name="dcc4"
    select="floor($dcc4 div 4)"/>

    <!--* ycc: years in current century. *-->
    <xsl:variable name="ycc"
    select="floor((4 * $dcc + 3) div 1461)"/>

    <!--* dcy4: days in current year, times 4. *-->
    <xsl:variable name="dcy4"
    select="(4 * $dcc + 3) - (1461 * $ycc)"/>

    <!--* dcy: days in current year. *-->
    <xsl:variable name="dcy"
    select="floor(($dcy4 + 4) div 4)"/>

    <!--* rgtm: RGT month number (0 Mar, 1 Apr ... 12 Feb). *-->
    <xsl:variable name="rgtm"
    select="floor((5 * $dcy - 3) div 153)"/>

    <!--* dcm5: days in current month (minus 1) times 5. *-->
    <xsl:variable name="dcm5"
    select="5 * $dcy - 3 - 153 * $rgtm"/>

    <!--* d: day number in current month. *-->
    <xsl:variable name="d"
    select="floor(($dcm5 + 5) div 5)"/>

    <!--* rgty: RGT year number. *-->
    <xsl:variable name="rgty"
    select="100 * $cce + $ycc"/>

    <!--* y: Gregorian year number. *-->
    <xsl:variable name="y">
    <xsl:choose>
    <xsl:when test="$rgtm &lt; 10">
    <xsl:value-of select="$rgty"/>
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="$rgty + 1"/>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:variable>

    <!--* m: Gregorian month number. *-->
    <xsl:variable name="m">
    <xsl:choose>
    <xsl:when test="$rgtm &lt; 10">
    <xsl:value-of select="$rgtm + 3"/>
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="$rgtm - 9"/>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:variable>

    <!--* Return value in ISO 8601 format *-->
    <xsl:value-of select="concat(
    format-number($y,'0000'),
    '-',
    format-number($m,'00'),
    '-',
    format-number($d,'00')
    )"/>
    </xsl:template>

    请注意,如所写,这将返回 ISO 格式的日期;如果您想要 dd/mm/yyyy 或 mm/dd/yyyy 或其他格式,您将需要更改它。

    祝你好运。

    关于xslt - 如何将 5 个工作日添加到现有值 xslt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18306380/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com