XSLT có thể chèn ngày hiện tại không?


92

Một chương trình chúng tôi sử dụng trong văn phòng của tôi xuất các báo cáo bằng cách dịch một tệp XML mà nó xuất ra với một tệp XSLT sang XHTML. Tôi đang viết lại XSLT để thay đổi định dạng và thêm thông tin từ Tệp XML nguồn.

Tôi muốn bao gồm ngày tệp được tạo trong báo cáo cuối cùng. Nhưng ngày / giờ hiện tại không có trong tệp XML ban đầu, tôi cũng không có bất kỳ quyền kiểm soát nào về cách tệp XML được tạo. Dường như không có bất kỳ hàm ngày nào được tích hợp vào XSLT sẽ trả về ngày hiện tại.

Có ai có ý kiến ​​về cách tôi có thể bao gồm ngày hiện tại trong quá trình chuyển đổi XSLT của mình không?


Tôi không biết trình phân tích cú pháp đang được sử dụng đó là vấn đề. Chương trình tôi đã sử dụng xuất báo cáo trực tiếp và sử dụng tệp XSLT trong thư mục chương trình của nó để tạo báo cáo.
Eric Anastas

Câu trả lời:


115

XSLT 2

Các hàm ngày có sẵn nguyên bản, chẳng hạn như:

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

Ngoài ra còn có current-date()current-time().

XSLT 1

Sử dụng gói mở rộng ngày và giờ EXSLT.

  1. Tải xuống gói ngày và giờ từ GitHub .
  2. Giải nén date.xslđến vị trí của các tệp XSL của bạn.
  3. Đặt tiêu đề của biểu định kiểu.
  4. Nhập khẩu date.xsl.

Ví dụ:

<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
Đối với bất kỳ ai sử dụng .net / c # , đừng dành quá nhiều thời gian để cố gắng làm cho các bản nhập EXSLT hoạt động với các máy biến áp .NET XSLT tiêu chuẩn - hãy sử dụng MVP.XML ngay lập tức. Nó có hỗ trợ tích hợp cho ESXLT .
Joel Purra

14

Đối với trình phân tích cú pháp MSXML, hãy thử cách này:

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

Đồng thời đọc Tập lệnh biểu định kiểu XSLT bằng msxsl: scriptMở rộng XSLT với JScript, C # và Visual Basic .NET


Điều này không hoạt động với Apache FOP làm máy biến áp. Thông báo lỗi: Instance gọi phương thức phương pháp hiện nay đòi hỏi phải có một thể hiện đối tượng như là đối số đầu tiên
Trey Carroll

1
oops: extension-element-prefixes = "msxml" phải là extension-element-prefixes = "msxsl". Không hoạt động được trên hệ thống của tôi.
Jay

14

Bạn có quyền kiểm soát việc chạy chuyển đổi không? Nếu vậy, bạn có thể chuyển ngày hiện tại vào XSL và sử dụng $ current-date từ bên trong XSL của mình. Dưới đây là cách bạn khai báo tham số đến, nhưng với việc biết bạn đang chạy biến đổi như thế nào, tôi không thể cho bạn biết cách truyền giá trị vào.

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

Ví dụ: từ tập lệnh bash, hãy sử dụng:

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

Sau đó, trong xsl, bạn có thể sử dụng:

<xsl:value-of select="$current-date"/>

1
Thật vậy, làm thế nào để truyền giá trị là phụ thuộc vào hệ thống. Một lựa chọn có thể: với xsltproc trên UNIX, nó có thể là: xsltproc --stringparam current-date `date +%Y-%m-%d` -o output.html path-to.xsl path-to.xml. Một số hệ thống cũng chỉ lấy tham số là $param=value, vì vậy trong trường hợp $current-date=`date +%Y-%m-%d`đó ở đâu đó. Hoặc nếu không, hãy tìm cách chỉ định các tham số trong bất kỳ bộ xử lý XSLT nào bạn đang sử dụng.
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

Câu trả lời muộn, nhưng giải pháp của tôi hoạt động trong Eclipse XSLT. Eclipse sử dụng XSLT 1 tại thời điểm viết bài này. Bạn có thể cài đặt một công cụ XSLT 2 như Saxon. Hoặc bạn có thể sử dụng giải pháp XSLT 1 bên dưới để chèn ngày và giờ hiện tại.

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

Điều này sẽ gọi lớp Dữ liệu của Java để xuất ra ngày tháng. Nó sẽ không hoạt động trừ khi bạn cũng đặt định nghĩa "java:" sau trong <xsl:stylesheet>thẻ của mình .

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

Tôi hy vọng điều đó sẽ giúp ai đó. Câu trả lời đơn giản này rất khó tìm đối với tôi.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.