XSLT 1.0, как увеличить дату - PullRequest
2 голосов
/ 23 апреля 2011

ОБНОВЛЕНИЕ: Невозможно использовать расширения EXSLT.Также я использую дату в двух разных местах, и я хочу обновить только одно из них, а не оба.

Мне нужно увеличить дату в моем преобразовании XSLT.Я использую XSLT 1.0.

В исходном XML у меня есть такая дата

<XML>
    <Date>4/22/2011 3:30:43 PM</Date>
</XML>

Затем мне нужно добавить 10 лет к выводу.Вот так

<Output>
   <Odate>4/22/2011 3:30:43 PM</Odate>
   <Cdate>4/22/2021 3:30:43 PM</Cdate>
</Output>

Как это можно сделать в XSLT 1.0.Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 23 апреля 2011

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

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

<xsl:param name="year-inc" select="10"/>

<xsl:template match="XML">
  <Output>
    <xsl:apply-templates/>
  </Output>
</xsl:template>

<xsl:template match="Date">
  <xsl:variable name="d0" select="substring-before(., '/')"/>
  <xsl:variable name="d1" select="substring-before(substring-after(., '/'), '/')"/>
  <xsl:variable name="d2" select="substring-after(substring-after(., '/'), '/')"/>
  <xsl:variable name="new-year" select="substring($d2, 1, 4) + $year-inc"/>
  <Cdate>
    <xsl:value-of select="concat($d0, '/', $d1, '/', $new-year, substring($d2, 5))"/>
  </Cdate>
</xsl:template>

</xsl:stylesheet>
2 голосов
/ 23 апреля 2011

Зависит от того, насколько привередливы вы хотите быть, например какая дата через 10 лет после 29 февраля 2004 года? Существует ряд полезных подпрограмм обработки дат XSLT 1.0, которые вы можете скачать по адресу www.exslt.org. Я думаю, они включают в себя оба шаблона разбора даты, которые преобразуют вашу дату в американском формате в стандартную дату ISO, арифметические шаблоны даты позволит вам добавить длительность к дате в формате ISO и функцию форматирования даты, которая вернет ее в формат США.

0 голосов
/ 24 апреля 2011

Я понял это с помощью @Martin.Я расширяю код @ Martin и вызываю шаблон только тогда, когда мне нужно изменить дату.

XSLT:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:param name="year-inc" select="10"/>

  <xsl:template match="XML">
    <Output>
      <Odate>
        <xsl:value-of select="Date"/>
      </Odate>
      <Cdate>
        <xsl:call-template name="increment"/>
      </Cdate>
    </Output>
  </xsl:template>

  <xsl:template name="increment">
    <xsl:variable name="d0" select="substring-before(Date, '/')"/>
    <xsl:variable name="d1" select="substring-before(substring-after(Date, '/'), '/')"/>
    <xsl:variable name="d2" select="substring-after(substring-after(Date, '/'), '/')"/>
    <xsl:variable name="new-year" select="substring($d2, 1, 4) + $year-inc"/>
    <xsl:value-of select="concat($d0, '/', $d1, '/', $new-year, substring($d2, 5))"/>
  </xsl:template>

</xsl:stylesheet>

Вывод:

<?xml version="1.0" encoding="utf-8"?>
<Output>
  <Odate>4/22/2011 3:30:43 PM</Odate>
  <Cdate>4/22/2021 3:30:43 PM</Cdate>
</Output>
...