是否有一些简单的方法可以根据存储在 XML 中的日期值计算 Weeknumber 值?
它需要是纯 XSLT 解决方案。我不能使用任何代码:(
如果您可以使用 EXSLT,则可以使用多种日期函数。所有这些都在 Saxon 中实现,但如果您使用 MSXSL,Chris Bayes 已将它们实现为扩展函数,您实际上可以将其放置在 msxsl:script 元素内的转换中。他的实现从每个特定的日期功能页面链接。
week-in-year()是您正在寻找的功能吗?
编辑:根据 JeniT 的评论,在同一个站点上 有一个纯 XSLT 1.0 模板,其功能与 week-in-year() (我认为是她写的)相同,它可能更符合您的要求。
如果您总是希望一周从同一天开始,那么周计算可能会变得非常复杂,因为一年中的第一天总是在变化。有一个计算它的 ISO 标准,请参阅此 Wikipedia 文章。
这是一个纯 XSLT 1.0 解决方案:
可以使用datetime_lib.xsl
Martin Rowlinson 的样式表模块,它附带XSelerator(一个不错的 XSLT IDE,最近在 sourceforge 上免费提供)。您必须下载并安装此应用程序,然后您会发现大量额外的库以及高级技术和解决方案的示例。
该datetime_lib.xsl
文件可以在以下位置找到(对于典型安装):
C:\Program Files\Marrowsoft\Xselerator25\Samples\Libraries\
在这个库中,这里是名为“week-number”的模板:
<xsl:template name="周数"> <xsl:param name="年份"/> <xsl:param name="月"/> <xsl:param name="day"/> <!-- 或 --> <xsl:param name="date" select="''"/> <!-- 格式:yyyymmdd 或 yyyy-mm-dd --> <!-- 或 --> <xsl:param name="julian-day" select="''"/> <!-- 缩减日期 --> <xsl:variable name="tdate" select="translate($date,'-','')"/> <!-- 决定传递了哪些参数 --> <xsl:变量名="yyyy"> <xsl:选择> <xsl:when test="string-length($date) > 0"><xsl:value-of select="substring($tdate,1,4)"/></xsl:when> <xsl:when test="string-length($julian-day) > 0"> <xsl:变量名="jdate"> <xsl:call-template name="julian-day-to-date"> <xsl:with-param name="julian-day" select="$julian-day"/> </xsl:调用模板> </xsl:变量> <xsl:value-of select="substring($jdate,1,4)"/> </xsl:when> <xsl:otherwise><xsl:value-of select="$year"/></xsl:otherwise> </xsl:选择> </xsl:变量> <!-- 获取儒略日数 --> <xsl:变量名="jd"> <xsl:选择> <xsl:when test="string-length($julian-day) > 0"><xsl:value-of select="$julian-day"/></xsl:when> <xsl:否则> <xsl:call-template name="date-to-julian-day"> <xsl:with-param name="year" select="$year"/> <xsl:with-param name="month" select="$month"/> <xsl:with-param name="day" select="$day"/> <xsl:with-param name="date" select="$date"/> </xsl:调用模板> </xsl:否则> </xsl:选择> </xsl:变量> <!-- 获取明年第一个工作日的儒略日数 --> <xsl:变量名="fyjd"> <xsl:call-template name="first-day-of-year"> <xsl:with-param name="year" select="$yyyy+1"/> <xsl:with-param name="as-julian-day" select="true()"/> </xsl:调用模板> </xsl:变量> <!-- 决定这个日期的“工作”年份是哪一年 --> <xsl:variable name="start-jd"> <xsl:选择> <xsl:when test="$jd >= $fyjd"><xsl:value-of select="$fyjd"/></xsl:when> <xsl:否则> <xsl:call-template name="date-to-julian-day"> <xsl:with-param name="日期"> <xsl:call-template name="first-day-of-year"> <xsl:with-param name="year" select="$yyyy"/> </xsl:调用模板> </xsl:with-param> </xsl:调用模板> </xsl:否则> </xsl:选择> </xsl:变量> <!-- 最终计算输出 --> <xsl:value-of select="floor(($jd - $start-jd) div 7) + 1"/> </xsl:模板>
这是一个使用“week-number”模板的简单 XSLT 转换:
<xsl:stylesheet 版本="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> <xsl:导入 href= "C:\Program Files\Marrowsoft\Xselerator25\Samples\Libraries\datetime_lib.xsl"/> <xsl:输出方法="文本"/> <xsl:模板匹配="/"> <xsl:call-template name="week-number"> <xsl:with-param name="date" select="'2008-11-16'"/> </xsl:调用模板> </xsl:模板> </xsl:样式表>
当应用于任何源 XML 文档(未使用)时,会产生所需的结果:
46
希望这次的答案真的更有帮助。
干杯,
迪米特雷·诺瓦切夫。
查看 Sal Mangano 的 XSLT Cookbook。有趣的是,它可以在Google Books上找到。
xslt 2.0 的方式是:
<xsl:function name="chkbk:calculate-week-number" as="xs:integer">
<xsl:param name="date" as="xs:date" />
<xsl:sequence select="xs:integer(format-date($date,'[W]'))" />
</xsl:function>
对于 1.0 方式,请参阅 Cookbox 预览。顺便说一句,我只是用谷歌搜索 xslt weeknumber 来找到它。
我使用 Visual Basic 进行编程,所以我知道如何使用 VB.NET 进行编程。将您的 XML 日期读入一个变量(我们称之为SomeDate)。然后你构建一个新的日期,你知道它是包含未知日期的年初。然后,您让DateDiff函数完成它的工作来告诉您周数。
Dim SomeDate As Date = ReadDateFromXML()
Dim YearStart As New Date(Year(SomeDate), 1, 1)
Dim WeekNumber As Integer = DateDiff(DateInterval.WeekOfYear, YearStart, SomeDate)
在 C# 中:
DateTime date = DateTime.Now;
int week = date.DayOfYear / 7;
Console.WriteLine(week);