6

是否有一些简单的方法可以根据存储在 XML 中的日期值计算 Weeknumber 值?

它需要是纯 XSLT 解决方案。我不能使用任何代码:(

4

6 回答 6

5

如果您可以使用 EXSLT,则可以使用多种日期函数。所有这些都在 Saxon 中实现,但如果您使用 MSXSL,Chris Bayes 已将它们实现为扩展函数,您实际上可以将其放置在 msxsl:script 元素内的转换中。他的实现从每个特定的日期功能页面链接。

week-in-year()是您正在寻找的功能吗?

编辑:根据 JeniT 的评论,在同一个站点上 有一个纯 XSLT 1.0 模板,其功能与 week-in-year() (我认为是她写的)相同,它可能更符合您的要求。

于 2008-10-07T22:05:49.693 回答
1

如果您总是希望一周从同一天开始,那么周计算可能会变得非常复杂,因为一年中的第一天总是在变化。有一个计算它的 ISO 标准,请参阅此 Wikipedia 文章

于 2008-10-07T15:11:58.437 回答
1

这是一个纯 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

希望这次的答案真的更有帮助。

干杯,

迪米特雷·诺瓦切夫。

于 2008-11-16T16:49:32.810 回答
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 来找到它。

于 2008-10-08T14:35:24.830 回答
-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)
于 2008-10-07T15:05:11.993 回答
-3

在 C# 中:

DateTime date = DateTime.Now;
int week = date.DayOfYear / 7;
Console.WriteLine(week);
于 2008-10-07T15:10:16.960 回答