XSLT - 将日期(YYYY-MM-DD)转换为Julian Day Number

时间:2016-07-05 15:03:28

标签: xml date xslt xslt-2.0

尝试将标准日期转换为Julian天数。是否有用于成功转换日期的功能或方法?这适用于XSLT 2.0。另外一个限制是不能使用额外的附加软件包,只需要直接使用XSLT 2.0

提前感谢您的意见。

示例:2016-07-05转换为2457574.50000

1 个答案:

答案 0 :(得分:1)

首先,YYYY-MMM-DD不是标准日期。在使用任何日期函数之前,必须将提供的字符串转换为YYYY-MM-DD格式的有效日期。完成后,计算可以非常简单。

为方便起见,以下样式表使用两个自定义函数:一个用于将字符串转换为正确的日期,另一个用于计算实际的Julian日期数。

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="http://www.example.com/my"
exclude-result-prefixes="xs my">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:function name="my:reformat-date">
    <xsl:param name="datestring"/>
    <xsl:variable name="y" select="substring($datestring, 1, 4)"/>
    <xsl:variable name="mmm" select="substring($datestring, 6, 3)"/>
    <xsl:variable name="d" select="substring($datestring, 10, 2)"/>
    <xsl:variable name="m" select="format-number(index-of(('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'), $mmm), '00')"/>
    <xsl:sequence select="xs:date(concat($y, '-', $m, '-', $d))" />
</xsl:function>

<xsl:function name="my:julian-day-number">
    <xsl:param name="date" as="xs:date"/>
    <xsl:variable name="epoch" select="xs:date('-4714-11-24')"/>
    <xsl:sequence select="days-from-duration($date - $epoch)"/>
</xsl:function>

<xsl:template match="/">
    <result>
        <xsl:value-of select="my:julian-day-number(my:reformat-date('2016-JUL-05'))" />
    </result>
</xsl:template>

</xsl:stylesheet>

<强>结果

<?xml version="1.0" encoding="UTF-8"?>
<result>2457575</result>

注意

严格地说,朱利安日数在中午变化。如果您的输入未指示当天的时间,则决定是否选择给定日期的AM或PM部分的编号完全是任意的。