Un XSLT peut-il insérer la date actuelle?

92

Un programme que nous utilisons dans mon bureau exporte des rapports en traduisant un fichier XML qu'il exporte avec un fichier XSLT en XHTML. Je réécris le XSLT pour modifier le formatage et ajouter plus d'informations à partir du fichier XML source.

J'aimerais inclure la date de création du fichier dans le rapport final. Mais la date / heure actuelle n'est pas incluse dans le fichier XML d'origine, et je n'ai aucun contrôle sur la façon dont le fichier XML est créé. Il ne semble pas y avoir de fonctions de date intégrées dans XSLT qui renverront la date actuelle.

Quelqu'un a-t-il une idée de la façon dont je pourrais être en mesure d'inclure la date actuelle lors de ma transformation XSLT?

Eric Anastas
la source
Je ne sais pas quel analyseur est utilisé, c'est le problème. Le programme que j'ai utilisé exporte les rapports directement et utilise le fichier XSLT dans son répertoire de programme pour générer les rapports.
Eric Anastas

Réponses:

115

XSLT 2

Les fonctions de date sont disponibles nativement, telles que:

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

Il y a aussi current-date()et current-time().

XSLT 1

Utilisez le package d'extension de date et d'heure EXSLT.

  1. Téléchargez le package de date et d'heures depuis GitHub .
  2. Extrayez date.xslà l'emplacement de vos fichiers XSL.
  3. Définissez l'en-tête de la feuille de style.
  4. Importer date.xsl.

Par exemple:

<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
la source
7
Pour quiconque utilise .net / c # , ne passez pas trop de temps à essayer de faire fonctionner les importations EXSLT avec les transformateurs .NET XSLT standard - utilisez immédiatement MVP.XML . Il a un support intégré pour ESXLT .
Joel Purra
14

Pour l'analyseur MSXML, essayez ceci:

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

Lisez également les scripts de feuille de style XSLT à l'aide de msxsl: script et l' extension de XSLT avec JScript, C # et Visual Basic .NET

Rubens Farias
la source
Cela ne fonctionne pas avec Apache FOP comme transformateur. Message d'erreur: L'appel de méthode d'instance à la méthode aujourd'hui nécessite une instance Object comme premier argument
Trey Carroll
1
oops: extension-element-prefixes = "msxml" devrait être extension-element-prefixes = "msxsl". Ne fonctionne pas non plus sur mon système.
Jay
14

Contrôlez-vous l'exécution de la transformation? Si tel est le cas, vous pouvez transmettre la date actuelle à la XSL et utiliser $ current-date depuis l'intérieur de votre XSL. Voici comment vous déclarez le paramètre entrant, mais sachant comment vous exécutez la transformation, je ne peux pas vous dire comment transmettre la valeur.

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

Par exemple, à partir du script bash, utilisez:

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

Ensuite, dans le xsl, vous pouvez utiliser:

<xsl:value-of select="$current-date"/>
Kevin Hakanson
la source
1
En effet, la façon de passer la valeur dépend du système. Une option possible: avec xsltproc sous UNIX, il pourrait être: xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml. Certains systèmes prennent également des paramètres comme $param=value, donc dans ce cas $current-date=`date +%Y-%m-%d`quelque part. Ou sinon, cherchez des moyens de spécifier des paramètres dans le processeur XSLT que vous utilisez.
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
la source
7

Réponse tardive, mais ma solution fonctionne dans Eclipse XSLT. Eclipse utilise XSLT 1 au moment de la rédaction de cet article. Vous pouvez installer un moteur XSLT 2 comme Saxon. Vous pouvez également utiliser la solution XSLT 1 ci-dessous pour insérer la date et l'heure actuelles.

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

Cela appellera la classe Data de Java pour afficher la date. Cela ne fonctionnera que si vous mettez également la définition "java:" suivante dans votre <xsl:stylesheet>balise.

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

J'espère que cela aide quelqu'un. Cette réponse simple a été difficile à trouver pour moi.

Mark Hamby
la source
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.

reference: Formatage des dates et des heures à l'aide de XSLT 2.0 et XPath

Noir
la source