2013-09-10 2 views
1

Я пытаюсь создать преобразование xsl, которое будет принимать дату, добавить к ней 27 дней и проверить, не падает ли эта новая дата в выходные и если это произойдет, он найдет следующий не выходной день (понедельник) и отобразит его в противном случае, показывая его, как если бы он не выпал на выходные. Возможно ли это, а также это необходимо учитывать високосные годы.Как проверить, выпадает ли дата в выходные в XSLT-файле

+1

Почему вы используете XSLT для этого? –

+0

К сожалению, это требование. – Icebreaker

+1

Вы должны получить помощь от http://stackoverflow.com/questions/18306380/how-to-add-5-business-days-to-an-existing-value-xslt/18354063#18354063 –

ответ

3

Начиная с даты:

<xsl:variable name="date" select="'2013-09-13T00:40:00'" /> 

Тогда, судя по всему, вы можете использовать:

<xsl:sequence select="$date +27*xs:dayTimeDuration('P1D')"/> 

Но это работает только в XSLT 2.0, которые не имеют.

Вы можете проверить, какой день недели это с помощью:

<xsl:variable name="day-of-week"> 
    <xsl:call-template name="calculate-day-of-the-week"> <!--0-6, where 0=Sun,1=Mon,2=Tue,3=Wed,4=Thu,5=Fri,6=Sat--> 
     <xsl:with-param name="date-time" select="$date" /> 
    </xsl:call-template> 
</xsl:variable> 

<xsl:template name="calculate-day-of-the-week"> 
    <xsl:param name="date-time"/> 
    <xsl:param name="date" select="substring-before($date-time,'T')"/> 
    <xsl:param name="year" select="substring-before($date,'-')"/> 
    <xsl:param name="month" select="substring-before(substring-after($date,'-'),'-')"/> 
    <xsl:param name="day" select="substring-after(substring-after($date,'-'),'-')"/> 
    <xsl:variable name="a" select="floor((14 - $month) div 12)"/> 
    <xsl:variable name="y" select="$year - $a"/> 
    <xsl:variable name="m" select="$month + 12 * $a - 2"/> 
    <xsl:value-of select="($day + $y + floor($y div 4) - floor($y div 100) + floor($y div 400) + floor((31 * $m) div 12)) mod 7"/> 
</xsl:template> 

«день-неделю» даст вам значение 0-6 (Sun в сб). Это будет приходиться високосных лет и будет работать в XSLT 1.0

Тогда вы могли бы использовать:

<xsl:if test="day-of-week=0> 
    <xsl:sequence select="$date +28*xs:dayTimeDuration('P1D')"/> 
</xsl:if> 
<xsl:if test="day-of-week=6> 
    <xsl:sequence select="$date +29*xs:dayTimeDuration('P1D')"/> 
</xsl:if> 

Я не могу проверить этот код без XSLT 2.0, но, надеюсь, это поможет вам идти в общем направление.

+0

+1, хороший ответ. BTW, если вы хотите XSLT 2.0, вы можете скачать Saxon бесплатно из http://sourceforge.net/projects/saxon/ – LarsH

+0

Я собираюсь попробовать это завтра и посмотреть, как это происходит. Вернется с моим результатом. Спасибо за помощь! – Icebreaker

0

В XSLT 2.0, использовать

test="xs:integer(format-date($date, '[F1]',(), 'ISO',())) ge 6" 

Это предполагает, что реализация поддерживает календарь ISO, в котором weakdays пронумерованы от 1 = понедельник 7 = воскресенье.

С другой стороны, возможно, лучше, получить количество дней с известным воскресенье, и принять результат по модулю 7: были предложены

($date - xs:date('1900-MM-DD')) div xs:dateTimeDuration('P1D') mod 7 ge 5 
0

Различные решения XSLT 2.0.

В XSLT 1.0 или 2.0 вы можете использовать шаблон jday, определенный here, для расчета номера юлианского дня для даты ввода. Добавить 27; сумма - это день юлианского дня дня 27 дней после даты ввода.

Для любого юлианского дня J самым простым способом определить день недели является вычисление J mod 7: если J mod 7 = 0, день - понедельник; если J mod 7 равно 5 или 6, день - суббота или воскресенье.

Чтобы найти следующий понедельник, добавьте соответствующее количество дней и используйте шаблон jdate, чтобы перевести его с юлианского дня на день.

Смежные вопросы