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?


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>


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


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

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()"/>

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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.