¿Puede un XSLT insertar la fecha actual?

92

Un programa que utilizamos en mi oficina exporta informes traduciendo un archivo XML que exporta con un archivo XSLT a XHTML. Estoy reescribiendo el XSLT para cambiar el formato y agregar más información del archivo XML de origen.

Me gustaría incluir la fecha en que se creó el archivo en el informe final. Pero la fecha / hora actual no está incluida en el archivo XML original, ni tengo ningún control sobre cómo se crea el archivo XML. No parece haber ninguna función de fecha incorporada en XSLT que devuelva la fecha actual.

¿Alguien tiene alguna idea de cómo podría incluir la fecha actual durante mi transformación XSLT?

Eric Anastas
fuente
No sé qué analizador se está utilizando, ese es el problema. El programa que utilicé exporta informes directamente y usa el archivo XSLT en su directorio de programa para generar los informes.
Eric Anastas

Respuestas:

115

XSLT 2

Las funciones de fecha están disponibles de forma nativa, como:

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

También hay current-date()y current-time().

XSLT 1

Utilice el paquete de extensión de fecha y hora EXSLT.

  1. Descargue el paquete de fecha y hora de GitHub .
  2. Extraiga date.xsla la ubicación de sus archivos XSL.
  3. Configure el encabezado de la hoja de estilo.
  4. Importar date.xsl.

Por ejemplo:

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

Jim Garrison
fuente
7
Para cualquiera que use .net / c # , no pierda demasiado tiempo tratando de hacer que las importaciones EXSLT funcionen con los transformadores estándar .NET XSLT; use MVP.XML de inmediato. Tiene soporte incorporado para ESXLT .
Joel Purra
14

Para el analizador MSXML, intente esto:

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

Lea también Scripts de hojas de estilo XSLT con msxsl: script y Ampliación de XSLT con JScript, C # y Visual Basic .NET

Rubens Farias
fuente
Esto no funciona con Apache FOP como transformador. Mensaje de error: la llamada del método de instancia al método hoy requiere una instancia de Object como primer argumento
Trey Carroll
1
Uy: extension-element-prefixes = "msxml" debe ser extension-element-prefixes = "msxsl". Tampoco funciona en mi sistema.
Jay
14

¿Tiene control sobre la ejecución de la transformación? Si es así, puede pasar la fecha actual al XSL y usar $ current-date desde dentro de su XSL. A continuación se muestra cómo declara el parámetro entrante, pero al saber cómo está ejecutando la transformación, no puedo decirle cómo pasar el valor.

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

Por ejemplo, desde el script bash, use:

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

Luego, en el xsl puedes usar:

<xsl:value-of select="$current-date"/>
Kevin Hakanson
fuente
1
De hecho, la forma de transferir el valor depende del sistema. Una opción posible: con xsltproc en UNIX, puede ser: xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml. Algunos sistemas también toman parámetros como $param=value, en ese caso, en $current-date=`date +%Y-%m-%d`algún lugar. O busque formas de especificar parámetros en cualquier procesador XSLT que esté usando.
lindes
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()"/>
Evgeny Glazov
fuente
7

Respuesta tardía, pero mi solución funciona en Eclipse XSLT. Eclipse usa XSLT 1 al momento de escribir este artículo. Puede instalar un motor XSLT 2 como Saxon. O puede usar la solución XSLT 1 a continuación para insertar la fecha y hora actuales.

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

Esto llamará a la clase Data de Java para generar la fecha. No funcionará a menos que también ponga la siguiente definición "java:" en su <xsl:stylesheet>etiqueta.

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

Espero que ayude a alguien. Esta simple respuesta fue difícil de encontrar para mí.

Mark Hamby
fuente
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.

referencia: Formateo de fechas y horas con XSLT 2.0 y XPath

Negro
fuente