2008-10-07 117 views

回答

5

如果您可以使用EXSLT,則有several date functions可用。所有這些都是在Saxon中實現的,但是如果您使用的是MSXSL,Chris Bayes已將它們實現爲擴展函數,您可以在msxsl:script元素中實際放置您的變換。他的實現從每個特定的日期函數頁面鏈接。

week-in-year()您正在尋找的功能?

編輯:每JeniT的評論,有在同一地點用相同的功能星期 - 年()(這是她寫的,我認爲),這可能會更好地滿足您需求的pure XSLT 1.0 template可用。

+0

如果您在該網站上查看,則會發現一個純XSLT 1.0模板,可以爲您執行此操作:http://www.exslt.org/date/functions/week-in- year/date.week-in-year.template.xsl – JeniT 2008-10-08 21:26:23

+0

所以有,我錯過了,甚至更好 – 2008-10-08 23:23:50

-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) 
+0

它需要是純粹的XSLT解決方案。我不能使用任何代碼:( – 2008-10-07 15:17:45

-3

而在C#:

DateTime date = DateTime.Now; 
int week = date.DayOfYear/7; 
Console.WriteLine(week); 
+0

它需要是純粹的XSLT解決方案我不能使用任何代碼:( – 2008-10-07 15:16:16

+0

這是不正確的... 看看這裏看看爲什麼: http://social.msdn.microsoft .com/Forums/en-US/vbgeneral/thread/e38accde-7eaa-462e-95d0-5a47b7dab832/ – 2009-03-29 11:23:02

1

如果您始終希望一週的同一天開始,那麼一週計算會變得非常複雜,因爲一年中的第一天總是在變化。有一個計算它的ISO標準,見this Wikipedia article

+0

我意識到這一點,但並不是必需的,Everyweek可以從星期天或星期一開始,我只需要計算兩個日期之間的差異(以星期爲單位) – 2008-10-07 15:20:19

0

查看Sal Mangano的XSLT食譜。有趣的是它可在books.google.com http://books.google.com/books?id=su4pWUPWwuEC&pg=PA125&lpg=PA125&dq=xslt+weeknumber&source=web&ots=nBBc3DVJYU&sig=l19cpOhwd9_PqrB72b9CCZk9wUA

了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找到這個。

1

這是一個純粹XSLT 1.0溶液

人們可以使用由Martin羅林森,附帶了XSelerator(一個不錯的XSLT IDE的datetime_lib.xsl樣式表模塊,最近提出sourceforge上自由使用)。您將不得不下載並安裝此應用程序,然後您將找到大量額外的庫和高級技術和解決方案樣本。

datetime_lib.xsl文件上可以找到(典型安裝):

              C:\ Program Files文件\ Marrowsoft \ Xselerator25 \的Samples \庫\

從這個庫,這裏是名爲「周編號」的模板:

<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文檔(未使用)應用,通緝結果產生:

     

希望這次的答案真的更有幫助。

乾杯,

Dimitre Novatchev。