是否有一些简单的方法可以从存储在XML中的日期值计算Weeknumber值?
它需要是纯XSLT解决方案。我不能使用任何代码:(
答案 0 :(得分:5)
如果您可以使用EXSLT,则可以使用several date functions。所有这些都是在Saxon中实现的,但是如果你使用的是MSXSL,那么Chris Bayes已经将它们实现为扩展函数,你可以将它们放在msxsl:script元素中的变换中。他的实现从每个特定日期功能页面链接。
week-in-year()是您正在寻找的功能吗?
编辑:根据JeniT的评论,同一网站上有一个pure XSLT 1.0 template,其功能与周年()相同(我认为,她写的),可能更符合您的要求。
答案 1 :(得分:1)
如果您总是希望在同一天开始一周,那么周计算会变得相当复杂,因为一年的第一天总是在变化。有一个用于计算它的ISO标准,请参阅this Wikipedia article。
答案 2 :(得分:1)
这是一个纯XSLT 1.0解决方案:
可以使用Martin Rowlinson的 datetime_lib.xsl
样式表模块,它带有 XSelerator (一个不错的XSLT IDE,最近自由制作)可在sourceforge上获得)。您必须下载并安装此应用程序,然后您将找到大量其他库和高级技术和解决方案的示例。
可以找到 datetime_lib.xsl
文件(针对典型安装):
C:\ Program Files \ Marrowsoft \ Xselerator25 \ Samples \ Libraries \
从这个库中,这里是名为“week-number”的模板:
<xsl:template name="week-number"> <xsl:param name="year"/> <xsl:param name="month"/> <xsl:param name="day"/> <!-- or --> <xsl:param name="date" select="''"/> <!-- format: yyyymmdd or yyyy-mm-dd --> <!-- or --> <xsl:param name="julian-day" select="''"/> <!-- trim down date --> <xsl:variable name="tdate" select="translate($date,'-','')"/> <!-- decide which params were passed --> <xsl:variable name="yyyy"> <xsl:choose> <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:variable name="jdate"> <xsl:call-template name="julian-day-to-date"> <xsl:with-param name="julian-day" select="$julian-day"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="substring($jdate,1,4)"/> </xsl:when> <xsl:otherwise><xsl:value-of select="$year"/></xsl:otherwise> </xsl:choose> </xsl:variable> <!-- get the julian day number --> <xsl:variable name="jd"> <xsl:choose> <xsl:when test="string-length($julian-day) > 0"><xsl:value-of select="$julian-day"/></xsl:when> <xsl:otherwise> <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:call-template> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- get the julian day number for the first working day of next year --> <xsl:variable name="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:call-template> </xsl:variable> <!-- decide which the 'working' year for this date is --> <xsl:variable name="start-jd"> <xsl:choose> <xsl:when test="$jd >= $fyjd"><xsl:value-of select="$fyjd"/></xsl:when> <xsl:otherwise> <xsl:call-template name="date-to-julian-day"> <xsl:with-param name="date"> <xsl:call-template name="first-day-of-year"> <xsl:with-param name="year" select="$yyyy"/> </xsl:call-template> </xsl:with-param> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- final calc output --> <xsl:value-of select="floor(($jd - $start-jd) div 7) + 1"/> </xsl:template>
以下是使用“周数”模板的简单XSLT转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> <xsl:import href= "C:\Program Files\Marrowsoft\Xselerator25\Samples\Libraries\datetime_lib.xsl"/> <xsl:output method="text"/> <xsl:template match="/"> <xsl:call-template name="week-number"> <xsl:with-param name="date" select="'2008-11-16'"/> </xsl:call-template> </xsl:template> </xsl:stylesheet>
当应用于任何源XML文档(未使用)时,将生成所需结果:
<强> 46 强>
希望这次答案真的更有帮助。
干杯,
Dimitre Novatchev。
答案 3 :(得分:0)
查看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来搜索它。
答案 4 :(得分:-2)
我在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)
答案 5 :(得分:-3)
在C#中:
DateTime date = DateTime.Now;
int week = date.DayOfYear / 7;
Console.WriteLine(week);