XSLT 1.0 如何递增日期

发布于 2024-11-02 21:21:41 字数 472 浏览 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 中完成此操作。提前致谢。

UPDATE: Cannot use any EXSLT extensions.
Also I'm using date in two different places and I only want to update one of them and not both.

I need to increment a date in my XSLT transformation. I'm using XSLT 1.0.

In source XML I have a date like this

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

Then I need to add 10 years to the output. Like this

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

How this can be done in XSLT 1.0. Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

魂归处 2024-11-09 21:21:41

以下不是一般的日期算术实现,但可能足以增加年份部分:

<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>

The following is no general date arithmetic implementation but might suffice to increment the year part:

<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>
月寒剑心 2024-11-09 21:21:41

取决于您想要变得多么挑剔,例如 2004 年 2 月 29 日之后 10 年后的日期是哪一天?有许多有用的 XSLT 1.0 日期处理例程,您可以在 www.exslt.org 下载,我认为它们包括一个解析日期模板,它将您的美国格式日期转换为标准 ISO 日期,日期算术模板将允许您向 ISO 格式日期添加持续时间,以及将其转换回美国格式的格式日期函数。

Depends a little how pernickety you want to be, e.g. what's the date 10 years after 29 Feb 2004? There are a number of useful XSLT 1.0 date-handling routines you can download at www.exslt.org, I think they include both a parse-date template which will convert your US-format date into a standard ISO date, date arithmetic templates which will allow you to add a duration to an ISO-format date, and a format-date function that will turn it back into US format.

吖咩 2024-11-09 21:21:41

我在@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>

I have figured it with the help of @Martin. I extend on @Martin's code and only called the template when I need to modify the date.

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>

Output:

<?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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文