XSLT - 将日期 (YYYY-MM-DD) 转换为儒略日数
XSLT - Convert Date (YYYY-MM-DD) to Julian Day Number
正在尝试将标准日期转换为儒略日数。您是否使用过成功转换日期的函数或方法?这是针对 XSLT 2.0 的。一个额外的约束是不能使用额外的附加包,直接使用 XSLT 2.0
提前感谢您的意见。
示例:2016-07-05 转换为 2457574.50000
首先,YYYY-MMM-DD
不是标准日期。您必须先将提供的字符串转换为 YYYY-MM-DD
格式的有效日期,然后才能使用任何日期函数。一旦你这样做了,计算就会非常简单。
为方便起见,以下样式表使用了两个自定义函数:一个用于将字符串转换为正确的日期,一个用于计算实际的儒略日数。
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>
注意:
严格来说,儒略日数字在中午发生变化。如果您的输入没有指示一天中的时间,那么 select 给定日期的上午或下午部分的数字完全是任意的。
正在尝试将标准日期转换为儒略日数。您是否使用过成功转换日期的函数或方法?这是针对 XSLT 2.0 的。一个额外的约束是不能使用额外的附加包,直接使用 XSLT 2.0
提前感谢您的意见。
示例:2016-07-05 转换为 2457574.50000
首先,YYYY-MMM-DD
不是标准日期。您必须先将提供的字符串转换为 YYYY-MM-DD
格式的有效日期,然后才能使用任何日期函数。一旦你这样做了,计算就会非常简单。
为方便起见,以下样式表使用了两个自定义函数:一个用于将字符串转换为正确的日期,一个用于计算实际的儒略日数。
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>
注意:
严格来说,儒略日数字在中午发生变化。如果您的输入没有指示一天中的时间,那么 select 给定日期的上午或下午部分的数字完全是任意的。