XSLT 1.0, как увеличить дату

ОБНОВЛЕНИЕ: нельзя использовать расширения 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. Заранее спасибо.


person JohnXsl    schedule 23.04.2011    source источник
comment
возможный дубликат XSL добавить продолжительность (дата exslt)   -  person    schedule 24.04.2011


Ответы (3)


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

<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>
person Martin Honnen    schedule 23.04.2011
comment
Спасибо за ответ. Это работает хорошо. Однако у меня есть вопрос. Я использую одну и ту же дату в двух разных местах. Я не хочу обновлять их обоих. Просто хочу обновить только один. Как я могу это осуществить. Я не упомянул об этом в посте. Если хотите, я могу опубликовать еще один вопрос. - person JohnXsl; 23.04.2011

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

person Michael Kay    schedule 23.04.2011
comment
Спасибо за ваш ответ. Я не могу использовать никакие расширения. Извините, я должен был упомянуть об этом в своем посте. Я обновлю свой пост, чтобы отразить это. - person JohnXsl; 23.04.2011
comment
@JohnXsl: есть и чистые реализации XSLT от Джени Теннисон. - person ; 24.04.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>
person JohnXsl    schedule 24.04.2011