XML に格納された日付値から Weeknumber 値を計算する簡単な方法はありますか?
純粋な XSLT ソリューションである必要があります。コードを使用できません:(
EXSLT を使用できる場合は、いくつかの日付関数を使用できます。これらはすべて Saxon で実装されていますが、MSXSL を使用している場合は、Chris Bayes が拡張関数として実装しており、msxsl:script 要素内の変換内に実際に配置できます。彼の実装は、特定の各日付関数ページからリンクされています。
week-in-year()はあなたが探している関数ですか?
編集: JeniT のコメントによると、week-in-year() と同じ機能を備えた純粋な XSLT 1.0 テンプレートが同じサイトで利用可能であり (彼女が書いたものだと思います)、要件により適している可能性があります。
年の最初の日は常に変化するため、週を常に同じ日に開始したい場合、週の計算はかなり複雑になる可能性があります。それを計算するための ISO 標準があります。このウィキペディアの記事を参照してください。
これは純粋な XSLT 1.0 ソリューションです。
XSelerator (最近、sourceforge で無料で利用できるようになった素敵な XSLT IDE)datetime_lib.xsl
に付属している、Martin Rowlinson によるスタイルシート モジュールを使用できます。このアプリケーションをダウンロードしてインストールする必要があります。その後、豊富な追加ライブラリと、高度な技術とソリューションのサンプルを見つけることができます。
datetime_lib.xsl
ファイルは次の場所にあります (通常のインストールの場合)。
C:\Program Files\Marrowsoft\Xselerator25\Samples\Libraries\
このライブラリから、「week-number」という名前のテンプレートを次に示します。
<xsl:template name="週番号"> <xsl:param name="年"/> <xsl:param name="月"/> <xsl:param name="日"/> <!-- または --> <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:いつ> <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="年" select="$年"/> <xsl:with-param name="月" select="$月"/> <xsl:with-param name="day" select="$day"/> <xsl:with-param name="date" select="$date"/> </xsl:呼び出しテンプレート> </xsl:そうでなければ> </xsl:選択> </xsl:変数> <!-- 翌年の最初の営業日の通算日を取得 --> <xsl:変数名="fyjd"> <xsl:call-template name="初日"> <xsl:with-param name="年" select="$yyyy+1"/> <xsl:with-param name="as-julian-day" select="true()"/> </xsl:呼び出しテンプレート> </xsl:変数> <!-- この日付の「稼働」年を決定 --> <xsl:変数名="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="date"> <xsl:call-template name="初日"> <xsl:with-param name="年" select="$yyyy"/> </xsl:呼び出しテンプレート> </xsl:with-param> </xsl:呼び出しテンプレート> </xsl:そうでなければ> </xsl:選択> </xsl:変数> <!-- 最終計算出力 --> <xsl:value-of select="floor(($jd - $start-jd) div 7) + 1"/> </xsl:テンプレート>
「週番号」テンプレートを使用した簡単な XSLT 変換を次に示します。
<xsl:stylesheet version="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="週番号"> <xsl:with-param name="date" select="'2008-11-16'"/> </xsl:呼び出しテンプレート> </xsl:テンプレート> </xsl:スタイルシート>
任意のソース XML ドキュメント (使用されていない) に適用すると、必要な結果が生成されます。
46
今回の答えが本当に役立つことを願っています。
乾杯、
ディミトレ・ノヴァチェフ。
Sal Mangano による XSLT Cookbook を参照してください。興味深いことに、Google ブックスで入手できます。
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 の方法については、クックボックスのプレビューを参照してください。ところで、これを見つけるために 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);