Czy XSLT może wstawić bieżącą datę?

Program, którego używamy w moim biurze eksportuje raporty, tłumacząc plik XML, który eksportuje za pomocą pliku XSLT do XHTML. Przepisuję XSLT, aby zmienić formatowanie i dodać więcej informacji ze źródłowego pliku XML.

Chciałbym umieścić datę utworzenia pliku w raporcie końcowym. Ale bieżąca data/czas nie jest zawarta w oryginalnym pliku XML, ani nie mam żadnej kontroli nad tym, jak plik XML jest tworzony. Wydaje się, że w XSLT nie ma żadnych funkcji date to zwróci aktualną datę.

Czy ktoś ma jakiś pomysł, jak Mogę być w stanie uwzględnić bieżącą datę podczas mojej transformacji XSLT?

 82
Author: Eric Anastas, 2009-10-16

6 answers

XSLT 2

Funkcje daty są dostępne natywnie, takie jak:

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

Istnieją również current-date() i current-time().

XSLT 1

Użyj pakietu exslt date and times extension.

  1. Pobierz date and times pakiet z GitHub .
  2. Rozpakuj date.xsl do lokalizacji plików XSL.
  3. Ustawia nagłówek arkusza stylów.
  4. Import date.xsl.

Na przykład:

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

 105
Author: Jim Garrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-23 09:07:31

Dla parsera MSXML spróbuj tego:

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

Przeczytaj również Skrypty arkusza stylów XSLT przy użyciu msxsl: script i rozszerzające XSLT o JScript, C# i Visual Basic. NET

 13
Author: Rubens Farias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 21:36:24

Czy masz kontrolę nad prowadzeniem transformacji? Jeśli tak, możesz przekazać bieżącą datę do XSL i użyć $current-date z wewnątrz twojego XSL. Poniżej jest jak deklarujesz przychodzący parametr, ale wiedząc, jak uruchamiasz transformację, nie mogę ci powiedzieć, jak przekazać wartość.

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

Na przykład ze skryptu bash użyj:

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

Następnie w xsl możesz użyć:

<xsl:value-of select="$current-date"/>
 13
Author: Kevin Hakanson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-14 08:43:47
...
    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()"/>
 9
Author: Evgeny Glazov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-03 14:02:05

Późna odpowiedź, ale moje rozwiązanie działa w Eclipse XSLT. Eclipse używa XSLT 1 w czasie pisania tego tekstu. Możesz zainstalować silnik XSLT 2 jak Saxon. Możesz też użyć poniższego rozwiązania XSLT 1, Aby wstawić bieżącą datę i godzinę.

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

Spowoduje wywołanie Klasy danych Javy w celu wypisania daty. Nie zadziała, jeśli nie umieścisz następującej definicji "java:" w znaczniku <xsl:stylesheet>.

<xsl:stylesheet [...snip...]
         xmlns:java="java"
         [...snip...]>
Mam nadzieję, że to komuś pomoże. Ta prosta odpowiedź była dla mnie trudna do znalezienia.
 6
Author: Mark Hamby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-25 09:05:25
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.

Referencja: formatowanie dat i godzin przy użyciu XSLT 2.0 i XPath

 5
Author: Black,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-22 00:21:22