Kann ein XSLT das aktuelle Datum einfügen?

92

Ein Programm, das wir in meinem Büro verwenden, exportiert Berichte, indem es eine exportierte XML-Datei mit einer XSLT-Datei in XHTML übersetzt. Ich schreibe das XSLT neu, um die Formatierung zu ändern und weitere Informationen aus der XML-Quelldatei hinzuzufügen.

Ich möchte das Erstellungsdatum der Datei in den Abschlussbericht aufnehmen. Das aktuelle Datum und die aktuelle Uhrzeit sind jedoch weder in der ursprünglichen XML-Datei enthalten, noch habe ich eine Kontrolle darüber, wie die XML-Datei erstellt wird. In XSLT scheinen keine Datumsfunktionen eingebaut zu sein, die das aktuelle Datum zurückgeben.

Hat jemand eine Idee, wie ich das aktuelle Datum während meiner XSLT-Transformation einbeziehen kann?

Eric Anastas
quelle
Ich weiß nicht, welcher Parser verwendet wird, das ist das Problem. Das von mir verwendete Programm exportiert Berichte direkt und verwendet die XSLT-Datei in seinem Programmverzeichnis, um die Berichte zu generieren.
Eric Anastas

Antworten:

115

XSLT 2

Datumsfunktionen sind nativ verfügbar, z.

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

Es gibt auch current-date()und current-time().

XSLT 1

Verwenden Sie das EXSLT-Erweiterungspaket für Datum und Uhrzeit.

  1. Laden Sie das Datums- und Uhrzeitpaket von GitHub herunter .
  2. Extrahieren Sie date.xslzum Speicherort Ihrer XSL-Dateien.
  3. Legen Sie den Stylesheet-Header fest.
  4. Importieren date.xsl.

Beispielsweise:

<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
quelle
7
Wenn Sie .net / c # verwenden , verbringen Sie nicht zu viel Zeit damit, EXSLT-Importe mit den Standard-.NET XSLT-Transformatoren zum Laufen zu bringen . Verwenden Sie MVP.XML sofort. Es hat integrierte Unterstützung für ESXLT .
Joel Purra
14

Versuchen Sie für MSXML-Parser Folgendes:

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

Lesen Sie auch XSLT Stylesheet Scripting mit msxsl: script und Erweitern von XSLT mit JScript, C # und Visual Basic .NET

Rubens Farias
quelle
Dies funktioniert nicht mit Apache FOP als Transformator. Fehlermeldung: Der heutige Aufruf der Instanzmethode an die Methode erfordert eine Objektinstanz als erstes Argument
Trey Carroll
1
oops: extension-element-prefixes = "msxml" sollte extension-element-prefixes = "msxsl" sein. Funktioniert auch auf meinem System nicht.
Jay
14

Haben Sie die Kontrolle über die Ausführung der Transformation? In diesem Fall können Sie das aktuelle Datum an die XSL übergeben und $ current-date in Ihrer XSL verwenden. Im Folgenden wird beschrieben, wie Sie den eingehenden Parameter deklarieren. Wenn Sie jedoch wissen, wie Sie die Transformation ausführen, kann ich Ihnen nicht sagen, wie Sie den Wert übergeben sollen.

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

Verwenden Sie beispielsweise im Bash-Skript Folgendes:

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

Dann können Sie in der xsl verwenden:

<xsl:value-of select="$current-date"/>
Kevin Hakanson
quelle
1
In der Tat hängt es vom System ab, wie der Wert übergeben wird. Eine mögliche Option: Mit xsltproc unter UNIX könnte es sein : xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml. Einige Systeme nehmen auch nur Parameter als $param=value, also in diesem Fall $current-date=`date +%Y-%m-%d`irgendwo. Oder suchen Sie auf andere Weise nach Möglichkeiten, Parameter in dem von Ihnen verwendeten XSLT-Prozessor anzugeben.
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
quelle
7

Späte Antwort, aber meine Lösung funktioniert in Eclipse XSLT. Eclipse verwendet zum Zeitpunkt dieses Schreibens XSLT 1. Sie können eine XSLT 2-Engine wie Saxon installieren. Oder Sie können die unten stehende XSLT 1-Lösung verwenden, um das aktuelle Datum und die aktuelle Uhrzeit einzufügen.

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

Dadurch wird die Datenklasse von Java aufgerufen, um das Datum auszugeben. Es funktioniert nur, wenn Sie auch die folgende "Java:" - Definition in Ihr <xsl:stylesheet>Tag einfügen.

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

Ich hoffe das hilft jemandem. Diese einfache Antwort war für mich schwer zu finden.

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

Referenz: Formatieren von Daten und Zeiten mit XSLT 2.0 und XPath

Schwarz
quelle