Può un XSLT inserire la data corrente?


92

Un programma che usiamo nel mio ufficio esporta i rapporti traducendo un file XML che esporta con un file XSLT in XHTML. Sto riscrivendo l'XSLT per modificare la formattazione e per aggiungere ulteriori informazioni dal file XML di origine.

Vorrei includere la data di creazione del file nel rapporto finale. Ma la data / ora corrente non è inclusa nel file XML originale, né ho alcun controllo su come viene creato il file XML. Non sembra esserci alcuna funzione di data integrata in XSLT che restituirà la data corrente.

Qualcuno ha idea di come potrei essere in grado di includere la data corrente durante la mia trasformazione XSLT?


Non so quale parser viene utilizzato questo è il problema. Il programma che ho utilizzato esporta direttamente i report e utilizza il file XSLT nella directory del programma per generare i report.
Eric Anastas

Risposte:


115

XSLT 2

Le funzioni di data sono disponibili in modo nativo, come ad esempio:

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

C'è anche current-date()e current-time().

XSLT 1

Utilizzare il pacchetto di estensione di data e ora EXSLT.

  1. Scarica il pacchetto di data e ora da GitHub .
  2. Estrai date.xslnella posizione dei tuoi file XSL.
  3. Imposta l'intestazione del foglio di stile.
  4. Importa date.xsl.

Per esempio:

<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
Per chiunque utilizzi .net / c # , non perdere troppo tempo a cercare di ottenere importazioni EXSLT funzionanti con i trasformatori .NET XSLT standard: usa subito MVP.XML . Ha il supporto integrato per ESXLT .
Joel Purra

14

Per il parser MSXML, prova questo:

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

Leggi anche XSLT Stylesheet Scripting using msxsl: script and Extending XSLT with JScript, C #, and Visual Basic .NET


Questo non funziona con Apache FOP come trasformatore. Messaggio di errore: la chiamata del metodo dell'istanza al metodo oggi richiede un'istanza di Object come primo argomento
Trey Carroll

1
oops: extension-element-prefixes = "msxml" dovrebbe essere extension-element-prefixes = "msxsl". Non funziona anche sul mio sistema.
Jay

14

Hai il controllo sull'esecuzione della trasformazione? In tal caso, puoi passare la data corrente all'XSL e utilizzare $ current-date dall'interno del tuo XSL. Di seguito è riportato come dichiari il parametro in arrivo, ma sapendo come stai eseguendo la trasformazione, non posso dirti come passare il valore.

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

Ad esempio, dallo script bash, usa:

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

Quindi, in xsl puoi usare:

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

1
In effetti, come trasferire il valore dipende dal sistema. Una possibile opzione: con xsltproc su UNIX, potrebbe essere: xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml. Alcuni sistemi accettano anche parametri come $param=value, quindi in quel caso $current-date=`date +%Y-%m-%d`da qualche parte. Oppure cerca modi per specificare i parametri in qualsiasi processore XSLT che stai utilizzando.
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()"/>

7

Risposta tardiva, ma la mia soluzione funziona in Eclipse XSLT. Eclipse utilizza XSLT 1 al momento della stesura di questo documento. Puoi installare un motore XSLT 2 come Saxon. Oppure puoi utilizzare la soluzione XSLT 1 di seguito per inserire la data e l'ora correnti.

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

Questo chiamerà la classe Data di Java per emettere la data. Non funzionerà a meno che non si inserisca anche la seguente definizione "java:" nel <xsl:stylesheet>tag.

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

Spero che aiuti qualcuno. Questa semplice risposta è stata difficile da trovare per me.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.