дата минус другая дата в xslt - PullRequest
3 голосов
/ 13 мая 2011

Надеюсь, кто-нибудь может помочь. Я пытаюсь сравнить две даты в XML-файле и использую XSLT для выполнения некоторых вычислений:

Например, у меня есть 2 даты в XML: 2011-05-23 и 2011-04-29. Я хочу сделать расчет внутри XSLT, как показано ниже:

(«2011-05-23» - «2011-04-29») * 30 = 24 * 30 = 720

Может ли кто-нибудь пролить свет?

Ответы [ 3 ]

2 голосов
/ 14 мая 2011

Решение XSLT 2.0

<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
<xsl:value-of select="days-from-duration(
                                         xs:date('2011-05-23')
                                         - xs:date(xs:date('2011-04-29'))
                      )*30"/>
</xsl:template>
</xsl:stylesheet>

Выход: 720

  • xs:date() Функция оценивает даты, которые можно использовать для выполненияоперации с датами
  • , вычитая вторую дату из первой, дают xdt:dayTimeDuration P24D (24 дня)
  • days-from-duration(), извлекающий компонент дней из xdt:dayTimeDuration (24)
  • , затем вы можете использовать это число для выполнения обычного арифметического (например, 24*30=720)
1 голос
/ 13 мая 2011

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

<xsl:template name="calcseconds">
  <xsl:param name="date" />
  <xsl:value-of select="(((substring($date,1,4) - 1970) * 365)+floor((substring($date,1,4) - 1970) div 4)+substring('000,031,059,090,120,151,181,212,243,273,304,334,365',substring($date,6,2)*4-3,3)+(substring($date,9,2)-1)+(1-floor(((substring($date,1,4) mod 4) + 2) div 3))*floor((substring($date,6,2)+17) div 20))*86400+(substring($date,12,2)*3600)+(substring($date,15,2)*60)+substring($date,18,2)" />
</xsl:template>

<xsl:template name="calcdays">
  <xsl:param name="date" />
  <xsl:value-of select="(((substring($date,1,4) - 1970) * 365)+floor((substring($date,1,4) - 1970) div 4)+substring('000,031,059,090,120,151,181,212,243,273,304,334,365',substring($date,6,2)*4-3,3)+(substring($date,9,2)-1)+(1-floor(((substring($date,1,4) mod 4) + 2) div 3))*floor((substring($date,6,2)+17) div 20))" />
</xsl:template>

Они немного заняты, но они рассчитывают количество секунд / дней с полуночи 1 января 1970 года как целое число, который вы можете затем сделать прямо арифметику.Они полагаются на формат даты yyyy-mm-dd hh:mm:ss, но манипулирование параметрами вызовов подстроки должно позволить вам обрабатывать даты в любом необходимом формате.

1 голос
/ 13 мая 2011

Возможно, стоит взглянуть на EXSLT - дата: разница .Я считаю, что следует делать то, что вы хотите, и есть даже прямая реализация XSLT.

Имейте в виду, что возвращаемое значение имеет формат продолжительности, как указано в XML-схеме Часть 2: Типы данных, второе издание, так что, скорее всего, вам нужно будет обработать результат, чтобы получить единицу, которую вы хотите использовать в расчете (например, в приведенном выше примере вы ожидаете получить результат, детализирующий разницу в количестве дней - поэтому вам нужно будет потянутьсоответствующий блок, с которым вы хотите работать, результат от даты: разница в этом случае, скорее всего, будет "P24D").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...