是否有一些简单的方法可以根据存储在 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.xslMartin 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);