Bisakah XSLT memasukkan tanggal sekarang?

92

Program yang kami gunakan di kantor saya mengekspor laporan dengan menerjemahkan file XML yang diekspor dengan file XSLT ke XHTML. Saya menulis ulang XSLT untuk mengubah pemformatan dan menambahkan lebih banyak informasi dari File XML sumber.

Saya ingin menyertakan tanggal pembuatan file di laporan akhir. Tetapi tanggal / waktu saat ini tidak disertakan dalam file XML asli, saya juga tidak memiliki kendali atas bagaimana file XML dibuat. Tampaknya tidak ada fungsi tanggal yang membangun XSLT yang akan mengembalikan tanggal sekarang.

Apakah ada yang tahu bagaimana saya bisa memasukkan tanggal saat ini selama transformasi XSLT saya?

Eric Anastas
sumber
Saya tidak tahu parser apa yang digunakan, itulah masalahnya. Program yang saya gunakan mengekspor laporan secara langsung dan menggunakan file XSLT di direktori programnya untuk menghasilkan laporan.
Eric Anastas

Jawaban:

115

XSLT 2

Fungsi tanggal tersedia secara native, seperti:

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

Ada juga current-date()dan current-time().

XSLT 1

Gunakan paket ekstensi tanggal dan waktu EXSLT.

  1. Unduh paket tanggal dan waktu dari GitHub .
  2. Ekstrak date.xslke lokasi file XSL Anda.
  3. Setel header stylesheet.
  4. Impor date.xsl.

Sebagai contoh:

<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
sumber
7
Untuk siapa pun yang menggunakan .net / c # , jangan menghabiskan terlalu banyak waktu untuk mencoba agar impor EXSLT bekerja dengan transformator .NET XSLT standar - gunakan MVP.XML segera. Ini memiliki dukungan built-in untuk ESXLT .
Joel Purra
14

Untuk parser MSXML, coba ini:

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

Baca juga XSLT Stylesheet Scripting menggunakan msxsl: script dan Memperluas XSLT dengan JScript, C #, dan Visual Basic .NET

Rubens Farias
sumber
Ini tidak bekerja dengan Apache FOP sebagai trafo. Pesan kesalahan: Panggilan metode instance ke metode hari ini memerlukan instance Object sebagai argumen pertama
Trey Carroll
1
oops: extension-element-prefixes = "msxml" harus extension-element-prefixes = "msxsl". Gagal juga bekerja di sistem saya.
Jay
14

Apakah Anda memiliki kendali untuk menjalankan transformasi? Jika demikian, Anda dapat meneruskan tanggal saat ini ke XSL dan menggunakan $ tanggal saat ini dari dalam XSL Anda. Di bawah ini adalah cara Anda mendeklarasikan parameter yang masuk, tetapi dengan mengetahui bagaimana Anda menjalankan transformasi, saya tidak dapat memberi tahu Anda cara meneruskan nilainya.

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

Misalnya, dari skrip bash, gunakan:

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

Kemudian, di xsl Anda dapat menggunakan:

<xsl:value-of select="$current-date"/>
Kevin Hakanson
sumber
1
Memang, cara melewatkan nilai tergantung pada sistem. Salah satu pilihan yang mungkin: dengan xsltproc pada UNIX, mungkin: xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml. Beberapa sistem juga hanya mengambil parameter sebagai $param=value, jadi dalam hal ini di $current-date=`date +%Y-%m-%d`suatu tempat. Atau cari cara untuk menentukan parameter dalam prosesor XSLT apa pun yang Anda gunakan.
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
sumber
7

Jawaban terlambat, tetapi solusi saya berfungsi di Eclipse XSLT. Eclipse menggunakan XSLT 1 pada saat penulisan ini. Anda dapat memasang mesin XSLT 2 seperti Saxon. Atau Anda dapat menggunakan solusi XSLT 1 di bawah ini untuk memasukkan tanggal dan waktu saat ini.

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

Ini akan memanggil kelas Data Java untuk menampilkan tanggal. Ini tidak akan bekerja kecuali jika Anda juga menempatkan definisi "java:" berikut di <xsl:stylesheet>tag Anda .

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

Saya harap itu membantu seseorang. Jawaban sederhana ini sulit ditemukan bagi saya.

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

referensi: Memformat Tanggal dan Waktu menggunakan XSLT 2.0 dan XPath

Hitam
sumber