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

93

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

Chciałbym zawrzeć datę utworzenia pliku w raporcie końcowym. Ale bieżąca data / godzina nie jest zawarta w oryginalnym pliku XML ani nie mam żadnej kontroli nad sposobem tworzenia pliku XML. Wygląda na to, że w XSLT nie ma żadnych funkcji daty, które zwracałyby bieżącą datę.

Czy ktoś ma pojęcie, w jaki sposób mogę uwzględnić bieżącą datę podczas mojej transformacji XSLT?

Eric Anastas
źródło
Nie wiem, jaki parser jest używany, a to jest problem. Program, którego użyłem, eksportuje raporty bezpośrednio i używa pliku XSLT w swoim katalogu programu do generowania raportów.
Eric Anastas

Odpowiedzi:

117

XSLT 2

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

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

Jest też current-date()i current-time().

XSLT 1

Użyj pakietu rozszerzenia daty i godziny EXSLT.

  1. Pobierz pakiet daty i godzin z GitHub .
  2. Wypakuj date.xsldo lokalizacji plików XSL.
  3. Ustaw 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>

Jim Garrison
źródło
7
Dla każdego, kto używa .net / c # , nie spędzaj zbyt wiele czasu na próbach uzyskania importu EXSLT pracującego ze standardowymi transformatorami .NET XSLT - użyj MVP.XML od razu. Posiada wbudowaną obsługę ESXLT .
Joel Purra,
14

W przypadku 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ż o skryptach arkusza stylów XSLT przy użyciu msxsl: script i rozszerzaniu XSLT za pomocą JScript, C # i Visual Basic .NET

Rubens Farias
źródło
To nie działa z Apache FOP jako transformatorem. Komunikat o błędzie: dzisiejsze wywołanie metody dla metody wymaga wystąpienia obiektu Object jako pierwszego argumentu
Trey Carroll,
1
oops: extension-element-prefixes = "msxml" powinno być extension-element-prefixes = "msxsl". Nie działa również w moim systemie.
Jay
14

Czy masz kontrolę nad przebiegiem transformacji? Jeśli tak, możesz przekazać bieżącą datę do XSL i użyć $ current-date z wnętrza XSL. Poniżej znajduje się opis sposobu, w jaki deklarujesz przychodzący parametr, ale wiedząc, jak przeprowadzasz transformację, nie mogę 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"/>
Kevin Hakanson
źródło
1
Rzeczywiście, sposób przekazania wartości zależy od systemu. Jedną z możliwych opcji: z xsltproc na UNIX, może to być: xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml. Niektóre systemy po prostu przyjmują parametry jako $param=value, więc w takim przypadku $current-date=`date +%Y-%m-%d`gdzieś. Lub poszukaj sposobów na określenie parametrów w dowolnym używanym procesorze XSLT.
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
źródło
7

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

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

Spowoduje to wywołanie klasy Data Javy w celu wyświetlenia daty. Nie zadziała, jeśli w <xsl:stylesheet>tagu nie umieścisz również następującej definicji „java:” .

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

Mam nadzieję, że to komuś pomoże. Ta prosta odpowiedź była dla mnie trudna do znalezienia.

Mark Hamby
źródło
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.

odniesienie: Formatowanie dat i godzin przy użyciu XSLT 2.0 i XPath

czarny
źródło