4

値が「16/10/2008」の「DateSet」という文字列があります。その値に 5 営業日を追加したいと考えています。日付であることを認識できるように、値を何かに変換する必要があると思います。

xslt 1.0 を使用しており、カスタム ソフトウェアを使用して xslt を Word ドキュメントに変換しています。今それは示しています:

<w:p>
  <w:r>
    <w:t>Some text [DateSet]</w:t>
  </w:r>
</w:p>

[日付セット] 2008 年 10 月 16 日

しかし、私が示したいのは次のとおりです。

<w:p>
  <w:r>
    <w:t>Some text [DateSet+5business days]</w:t>
  </w:r>
</w:p>

[日付セット + 5 営業日] が 2008 年 10 月 23 日を表示する場所

ms:format-date を使用して何らかの方法で変換する必要がありますか?

4

2 に答える 2

2

あなたの説明から、日付文字列をコンテキストから分離したように聞こえるので、それを操作して新しい日付に置き換えることができます。良い。それが真実でない場合、最初の問題はそれを真実にすることです。

拡張関数 ms:format-date() が役立つかもしれませんが、そのドキュメントを一瞥すると、その方法がわかりません。

日付を指定すると、XSLT 1.0 で必要な種類の日付演算を実行する最も簡単な方法は次のようになると思います。

  1. 日付を整数に変換します (例: ユリウス日)。
  2. 日付演算を実行します。
  3. 結果の整数を日付に変換します。

日付を整数に変換するには、次のテンプレートを使用できます。これは Robert G. Tantzen の "Algorithm 199: Conversions between calendar date and Julian day number" CACM 6.8 (Aug 1963): 444 に基づいています。日付文字列から年、月、日の数字を解析して渡す必要があります。それらをパラメーターで。

<xsl:template name="jday">
  <!--* JDay:  convert a triple of integers representing
  * Gregorian year, month, and day numbers to the
  * number of the Julian day beginning at noon on that
  * date.
  * Transcribed from Robert G. Tantzen, "Algorithm
  * 199:  Conversions between calendar date and Julian
  * day number" CACM 6.8 (Aug 1963): 444.
      *-->
  <xsl:param name="year" select="1963"/>
  <xsl:param name="month" select="08"/>
  <xsl:param name="day" select="13"/>

  <xsl:variable name="y">
<xsl:choose>
  <xsl:when test="$month > 2">
    <xsl:value-of select="$year"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="$year - 1"/>
  </xsl:otherwise>
</xsl:choose>
  </xsl:variable>
  <xsl:variable name="m">
<xsl:choose>
  <xsl:when test="$month > 2">
    <xsl:value-of select="$month - 3"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="$month + 9"/>
  </xsl:otherwise>
</xsl:choose>
  </xsl:variable>
  <xsl:variable name="d" select="$day"/>
  <xsl:variable name="c" select="floor($y div 100)"/>
  <xsl:variable name="ya" select="$y - 100 * $c"/>

  <!--* H holds the offset between Julian day 0
      * and the beginning of the common era.
      *-->
  <xsl:variable name="H" select="1721119"/>
  <!--* Calculate the Julian day that begins on the 
      * given date.
      *-->
  <xsl:value-of select="floor(($c * 146097) div 4) 
            + floor(($ya * 1461) div 4) 
            + floor((($m * 153) + 2) div 5) 
            + $d 
            + $H"/>

</xsl:template>

日付計算を実行するのは少し難しいかもしれません: 平日の場合、5 営業日後の日付は (私が推測するに) 7 暦日後です。週末の場合は、5 営業日後の日付が次の金曜日になると思います。ユリウス日番号 $j を指定すると、$j mod 7 を計算することで曜日を取得できます: 0 = 月曜日、1 = 火曜日、...、6 = 日曜日。したがって、計算は次のようになります

<xsl:choose>
  <xsl:when test="$j mod 7 = 5">
    <xsl:value-of select="$j + 6"/>
  </xsl:when>
  <xsl:when test="$j mod 7 = 6">
    <xsl:value-of select="$j + 5"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="$j + 7"/>
  </xsl:otherwise>
</xsl:choose>

休日については、関心のある期間について外部の情報源を参照する必要があります。幸運を。

結果の日数をカレンダーの日付に戻す変換は、Tantzen 1963 から転記した次のテンプレートを使用して行うことができます。

<xsl:template name="jdate">
  <!--* JDate:  given a Julian day number, return an ISO
  * 8601 date.  
  * Transcribed from Robert G. Tantzen, "Algorithm
  * 199:  Conversions between calendar date and Julian
  * day number" CACM 6.8 (Aug 1963): 444.
      *-->
  <xsl:param name="j" select="2438255"/>

  <!--* dce:  days in the common era (i.e. since 
      * 0000-03-01; Tantzen uses 1 Mar, not 1 Jan,
      * as his epoch to simplify calculations). *-->
  <xsl:variable name="dce" select="$j - 1721119"/>

  <!--* cce:  full centuries in the common era. *-->
  <xsl:variable name="cce" 
                select="floor((4 * $dce - 1) div 146097)"/>

  <!--* dcc4:  days in current century, times 4. *-->
  <xsl:variable name="dcc4" 
                select="(4 * $dce - 1) - (146097 * $cce)"/>

  <!--* dcc:  days in current century. *-->
  <xsl:variable name="dcc4" 
                select="floor($dcc4 div 4)"/>

  <!--* ycc:  years in current century. *-->
  <xsl:variable name="ycc" 
                select="floor((4 * $dcc + 3) div 1461)"/>

  <!--* dcy4:  days in current year, times 4. *-->
  <xsl:variable name="dcy4" 
                select="(4 * $dcc + 3) - (1461 * $ycc)"/>

  <!--* dcy:  days in current year. *-->
  <xsl:variable name="dcy" 
                select="floor(($dcy4 + 4) div 4)"/>

  <!--* rgtm:  RGT month number (0 Mar, 1 Apr ... 12 Feb). *-->
  <xsl:variable name="rgtm" 
                select="floor((5 * $dcy - 3) div 153)"/>

  <!--* dcm5:  days in current month (minus 1) times 5. *-->
  <xsl:variable name="dcm5" 
                select="5 * $dcy - 3 - 153 * $rgtm"/>

  <!--* d:  day number in current month. *-->
  <xsl:variable name="d" 
                select="floor(($dcm5 + 5) div 5)"/>

  <!--* rgty:  RGT year number. *-->
  <xsl:variable name="rgty" 
                select="100 * $cce + $ycc"/>

  <!--* y:  Gregorian year number. *-->
  <xsl:variable name="y">
<xsl:choose>
  <xsl:when test="$rgtm &lt; 10">
    <xsl:value-of select="$rgty"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="$rgty + 1"/>
  </xsl:otherwise>
</xsl:choose>
  </xsl:variable>

  <!--* m:  Gregorian month number. *-->
  <xsl:variable name="m">
<xsl:choose>
  <xsl:when test="$rgtm &lt; 10">
    <xsl:value-of select="$rgtm + 3"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="$rgtm - 9"/>
  </xsl:otherwise>
</xsl:choose>
  </xsl:variable>

  <!--* Return value in ISO 8601 format *-->
  <xsl:value-of select="concat(
            format-number($y,'0000'),
            '-',
            format-number($m,'00'),
            '-',
            format-number($d,'00')
            )"/>
</xsl:template>

書かれているように、これは日付を ISO 形式で返すことに注意してください。dd/mm/yyyy、mm/dd/yyyy、またはその他の形式が必要な場合は、変更する必要があります。

幸運を。

于 2013-08-19T18:29:19.953 に答える
1

私はあなたの問題を解決しようとしましたが、将来の要件のためにこれを強化する必要があります.

XSLT 1.0 の場合、http://xsltsl.sourceforge.net/にある拡張ライブラリをインポートし、 http://prdownloads.sourceforge.net/xsltsl/xsltsl-1.2.1.zip ZIP ファイルをダウンロードしてインポートする必要があります。生成された XSLT でここに示されているとおりです。

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:doc="http://xsltsl.org/xsl/documentation/1.0" xmlns:dt="http://xsltsl.org/date-time"
  xmlns:str="http://xsltsl.org/string" xmlns:dp="http://www.dpawson.co.uk"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes"
  extension-element-prefixes="doc str">

  <xsl:import href="xsltsl-1.2.1/stdlib.xsl"/>
  <xsl:import href="xsltsl-1.2.1/date-time.xsl"/>
  <xsl:param name="CurrentDate">21/08/2013</xsl:param>
  <xsl:param name="CurrentYear" select="substring-after(substring-after($CurrentDate,'/'),'/')"/>
  <xsl:param name="CurrentMonth" select="substring-before(substring-after($CurrentDate,'/'),'/')"/>
  <xsl:param name="CurrentDay" select="substring-before($CurrentDate,'/')"/>

  <xsl:template match="/">
    <xsl:text>Current given Date is : </xsl:text><xsl:value-of select="$CurrentDate"/><xsl:text>&#10;</xsl:text>
    <xsl:call-template name="GetCompleteUpdatedDate">
      <xsl:with-param name="UpdatedDay">
        <xsl:call-template name="UpdateDay">
          <xsl:with-param name="CurrentDay" select="$CurrentDay"/>
          <xsl:with-param name="LastDayOfMonth">
            <xsl:call-template name="dt:calculate-last-day-of-month">
              <xsl:with-param name="month" select="$CurrentMonth"/>
            </xsl:call-template>
          </xsl:with-param>
        </xsl:call-template>
      </xsl:with-param>
      <xsl:with-param name="LastDayOfMonth">
        <xsl:call-template name="dt:calculate-last-day-of-month">
          <xsl:with-param name="month" select="$CurrentMonth"/>
        </xsl:call-template>
      </xsl:with-param>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="UpdateDay">
    <xsl:param name="LastDayOfMonth"/>
    <xsl:param name="CurrentDay"/>
    <xsl:param name="RequiredDaysAddition">5</xsl:param>
    <xsl:param name="SaturdaySundayCount">0</xsl:param>
    <xsl:variable name="DayOfWeek">
      <xsl:call-template name="dt:calculate-day-of-the-week">
        <xsl:with-param name="year" select="$CurrentYear"/>
        <xsl:with-param name="month" select="$CurrentMonth"/>
        <xsl:with-param name="day" select="$CurrentDay"/>
      </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="DayAbbreviation">
      <xsl:call-template name="dt:get-day-of-the-week-abbreviation">
        <xsl:with-param name="day-of-the-week" select="$DayOfWeek"/>
      </xsl:call-template>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="$RequiredDaysAddition != 0">
        <xsl:choose>
          <xsl:when test="$DayAbbreviation = 'Sun' or $DayAbbreviation = 'Sat'">
            <xsl:call-template name="UpdateDay">
              <xsl:with-param name="LastDayOfMonth" select="$LastDayOfMonth"/>
              <xsl:with-param name="CurrentDay" select="$CurrentDay + 1"/>
              <xsl:with-param name="RequiredDaysAddition" select="$RequiredDaysAddition - 1"/>
              <xsl:with-param name="SaturdaySundayCount" select="$SaturdaySundayCount + 1"/>
            </xsl:call-template>
          </xsl:when>
          <xsl:otherwise>
            <xsl:call-template name="UpdateDay">
              <xsl:with-param name="LastDayOfMonth" select="$LastDayOfMonth"/>
              <xsl:with-param name="CurrentDay" select="$CurrentDay + 1"/>
              <xsl:with-param name="RequiredDaysAddition" select="$RequiredDaysAddition - 1"/>
              <xsl:with-param name="SaturdaySundayCount" select="$SaturdaySundayCount"/>
            </xsl:call-template>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$CurrentDay + $SaturdaySundayCount"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="GetCompleteUpdatedDate">
    <xsl:param name="UpdatedDay"/>
    <xsl:param name="LastDayOfMonth"/>
    <xsl:variable name="NewMonth">
      <xsl:choose>
        <xsl:when test="$UpdatedDay &gt; $LastDayOfMonth">
          <xsl:choose>
            <xsl:when test="($CurrentMonth + 1) = 12 or ($CurrentMonth + 1) &lt; 12">
              <xsl:value-of select="$CurrentMonth + 1"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="($CurrentMonth + 1) - 12"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$CurrentMonth"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name="NewYear">
      <xsl:choose>
        <xsl:when test="($CurrentMonth + 1) &gt; 12">
          <xsl:value-of select="$CurrentYear + 1"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$CurrentYear"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name="IsNewYearLeapYear">
      <xsl:call-template name="IsYearLeapYear"><xsl:with-param name="Year" select="$NewYear"/></xsl:call-template>
    </xsl:variable>
    <xsl:variable name="NewDay">
      <xsl:choose>
        <xsl:when test="$UpdatedDay &gt; $LastDayOfMonth">
          <xsl:value-of select="$UpdatedDay - $LastDayOfMonth"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$UpdatedDay"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:text>Updated date is : </xsl:text><xsl:value-of select="concat(format-number($NewDay,'00'), '/', format-number($NewMonth,'00'), '/', $NewYear)"/>
  </xsl:template>

  <xsl:template name="IsYearLeapYear">
    <xsl:param name="Year"/>
    <xsl:choose>
      <xsl:when test="($Year mod 4 = 0 and $Year mod 100 != 0) or $Year mod 400 = 0">True</xsl:when>
      <xsl:otherwise>False</xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

出力を確認するには、$CurrentDate の値を変更するだけです。

入力:

21/08/2013

出力:

Current given Date is : 21/08/2013
Updated date is : 28/08/2013

入力:

16/10/2008

出力:

Current given Date is : 16/10/2008
Updated date is : 23/10/2008
于 2013-08-21T09:44:16.847 に答える