XSLT 可以插入当前日期吗?

Posted

技术标签:

【中文标题】XSLT 可以插入当前日期吗?【英文标题】:Can an XSLT insert the current date? 【发布时间】:2010-12-07 04:51:14 【问题描述】:

我们在我的办公室使用的一个程序通过将它与 XSLT 文件一起导出的 XML 文件转换为 Xhtml 来导出报告。我正在重写 XSLT 以更改格式并从源 XML 文件中添加更多信息。

我想在最终报告中包含文件的创建日期。但是当前日期/时间不包含在原始 XML 文件中,我也无法控制 XML 文件的创建方式。 XSLT 中似乎没有任何日期函数可以返回当前日期。

有人知道如何在 XSLT 转换期间包含当前日期吗?

【问题讨论】:

我不知道正在使用什么解析器,这就是问题所在。我使用的程序直接导出报告,并使用其程序目录中的 XSLT 文件来生成报告。 【参考方案1】:

XSLT 2

日期函数原生可用,如:

<xsl:value-of  select="current-dateTime()"/>

还有current-date()current-time()

XSLT 1

使用 EXSLT 日期和时间扩展包。

    从GitHub下载date and times包。 将date.xsl 解压到XSL 文件所在的位置。 设置样式表头。 导入date.xsl

例如:

<xsl:stylesheet version="1.0" 
    xmlns:date="http://exslt.org/dates-and-times" 
    extension-element-prefixes="date"
    ...>

    <xsl:import href="date.xsl" />

    <xsl:template match="//root">
       <xsl:value-of select="date:date-time()"/>
    </xsl:template>
</xsl:stylesheet>

【讨论】:

对于任何使用 .net/c# 的人,不要花太多时间尝试让 EXSLT 导入与标准 .NET XSLT 转换器一起工作 - 立即使用 MVP.XML。它有built-in support for ESXLT。【参考方案2】:

您可以控制运行转换吗?如果是这样,您可以将当前日期传递给 XSL,并在您的 XSL 中使用 $current-date。下面是你如何声明传入参数,但知道你是如何运行转换的,我无法告诉你如何传入值。

<xsl:param name="current-date" />

例如,在 bash 脚本中,使用:

xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml

然后,在 xsl 中你可以使用:

<xsl:value-of select="$current-date"/>

【讨论】:

确实,如何传递值是依赖于系统的。一种可能的选择:在 UNIX 上使用 xsltproc,它可能是:xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml。有些系统也只是将参数作为$param=value,所以在这种情况下$current-date=`date +%Y-%m-%d` 某处。或者寻找在您使用的任何 XSLT 处理器中指定参数的方法。【参考方案3】:

对于 MSXML 解析器,试试这个:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:my="urn:sample" extension-element-prefixes="msxml">

    <msxsl:script language="JScript" implements-prefix="my">
       function today()
       
          return new Date(); 
        
    </msxsl:script> 
    <xsl:template match="/">

        Today = <xsl:value-of select="my:today()"/>

    </xsl:template> 
</xsl:stylesheet>

另请阅读XSLT Stylesheet Scripting using msxsl:script 和Extending XSLT with JScript, C#, and Visual Basic .NET

【讨论】:

这不适用于 Apache FOP 作为转换器。错误消息:今天对方法的实例方法调用需要一个 Object 实例作为第一个参数 oops:extension-element-prefixes="msxml" 应该是 extension-element-prefixes="msxsl"。也无法在我的系统上运行。【参考方案4】:
...
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:local="urn:local" extension-element-prefixes="msxsl">

    <msxsl:script language="CSharp" implements-prefix="local">
        public string dateTimeNow()
               
          return DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ"); 
         
    </msxsl:script>  
...
    <xsl:value-of select="local:dateTimeNow()"/>

【讨论】:

【参考方案5】:

迟到的答案,但我的解决方案适用于 Eclipse XSLT。在撰写本文时,Eclipse 使用 XSLT 1。您可以安装像 Saxon 这样的 XSLT 2 引擎。或者您可以使用下面的 XSLT 1 解决方案插入当前日期和时间。

<xsl:value-of select="java:util.Date.new()"/>

这将调用 Java 的 Data 类来输出日期。除非您在 &lt;xsl:stylesheet&gt; 标记中添加以下“java:”定义,否则它将无法工作。

<xsl:stylesheet [...snip...]
         xmlns:java="java"
         [...snip...]>

我希望对某人有所帮助。这个简单的答案对我来说很难找到。

【讨论】:

【参考方案6】:
format-date(current-date(), '[M01]/[D01]/[Y0001]') = 09/19/2013
format-time(current-time(), '[H01]:[m01] [z]') = 09:26 GMT+10
format-dateTime(current-dateTime(), '[h1]:[m01] [P] on [MNn] [D].') = 9:26 a.m. on September 19.

参考:Formatting Dates and Times using XSLT 2.0 and XPath

【讨论】:

以上是关于XSLT 可以插入当前日期吗?的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 转换日期时间

excel 工作表如何插入当前日期时间

XSLT选择当前级别不同属性的节点

如何在codeigniter的当前日期插入天间隔?

xslt 通过子节点和位置选择 rss 项目

如何在postgresql插入查询中插入当前日期时间[重复]