XSLT可以插入当前日期吗?


92

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

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

有谁知道我如何在XSLT转换过程中包括当前日期?


我不知道使用什么解析器就是问题所在。我使用的程序直接导出报告,并使用其程序目录中的XSLT文件生成报告。
Eric Anastas

Answers:


115

XSLT 2

日期函数是本地可用的,例如:

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

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

XSLT 1

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

  1. GitHub下载日期和时间包。
  2. 提取date.xsl到XSL文件的位置。
  3. 设置样式表标题。
  4. 导入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>


7
对于使用.net / c#的任何人,不要花太多时间尝试使EXSLT导入与标准.NET XSLT转换器一起使用-立即使用MVP.XML。它具有对ESXLT的内置支持
乔尔·普拉

14

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

另请阅读使用msxsl:script的XSLT样式表脚本使用JScript,C#和Visual Basic .NET扩展XSLT。


这不适用于Apache FOP作为转换器。错误消息:今天对方法的实例方法调用需要一个对象实例作为第一个参数
Trey Carroll

1
哎呀:extension-element-prefixes =“ msxml”应该是extension-element-prefixes =“ msxsl”。也无法在我的系统上工作。
2014年

14

您可以控制运行转换吗?如果是这样,您可以将当前日期传递给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"/>

1
确实,如何传递值取决于系统。一个可能的选择:在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处理器中指定参数的方法。
林德斯

10
...
    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()"/>

7

答案很晚,但是我的解决方案可以在Eclipse XSLT中使用。在撰写本文时,Eclipse使用XSLT 1。您可以安装XSLT 2引擎(如Saxon)。或者,您可以使用下面的XSLT 1解决方案插入当前日期和时间。

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

这将调用Java的Data类以输出日期。除非您还在<xsl:stylesheet>标签中添加以下“ 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.

参考:使用XSLT 2.0和XPath格式化日期和时间

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.