2012-02-22 37 views
9

Tôi có một nút trong tập tin XML của tôi chứa sau:XSLT 1.0 Nhận Current DateTime

<Apple>2011-12-01T16:33:33Z</Apple>

Tôi muốn lấy dòng này và thay thế bằng ngày hiện tại và thời gian sử dụng định dạng tương tự như hình ở trên.

YYYY-MM-DDThh: mm: SSZ

Nút nằm trong một không gian tên khai báo là 'x'

+0

có thể trùng lặp: http://stackoverflow.com/questions/500915/format-a-date-in-xml-via-xslt –

+0

@SivaCharan, không phải không, anh ấy đang tìm kiếm CURRENT DATE-TIME thay vì định dạng. –

+0

Xem http://stackoverflow.com/questions/5475699/cannot-use-the-current-datetime-function-in-xslt và http://stackoverflow.com/questions/1575111/can-an-xslt-insert- ngày hiện tại. Nếu bạn không thể sử dụng XSLT 2.0, hãy sử dụng hàm tập lệnh – StuartLC

Trả lời

11

Chơi với DateTime là không thể với XSLT 1.0 một mình .. Trong một tình huống tương tự tôi mất giúp đỡ của kịch bản .. (C#)

mẫu XML:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <Apple>2011-12-01T16:33:33Z</Apple> 
</root> 

mẫu XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:cs="urn:cs"> 
    <xsl:output method="xml" indent="yes"/> 
    <msxsl:script language="C#" implements-prefix="cs"> 
    <![CDATA[ 
     public string datenow() 
    { 
     return(DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'")); 
    } 
    ]]> 
    </msxsl:script> 
     <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Apple"> 
     <xsl:copy> 
     <xsl:value-of select="cs:datenow()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Kết quả đầu ra:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <Apple>2012-02-22T18:03:12Z</Apple> 
</root> 

Các kịch bản có thể nằm trong một tập tin tương tự (như tôi có nó trong mã XSLT mẫu của tôi) hoặc nếu mã kích hoạt XSLTransformation là C# sau đó di chuyển cùng mã trong sự kêu gọi place :)

+0

Làm việc hoàn toàn cảm ơn bạn! – Mike

+0

@Mike, vui mừng khi biết điều đó :) –

+0

Tôi sẽ nâng cao giải pháp nhưng không có đủ đại diện để làm như vậy :( – Mike

6

Tốt hơn là chuyển ngày giờ hiện tại từ công cụ XML của bạn. Khai báo <xsl:param name="current-datetime"/> trong số xsl:stylesheet và chuyển giá trị từ bộ xử lý.

0

Bạn sẽ chuyển dữ liệu hiện tại dưới dạng tham số đầu vào/xsl: param cho mẫu.

XSLT nhằm mục đích là ngôn ngữ thuần túy chức năng; nghĩa là tất cả các mẫu/chức năng phải phù hợp với ví dụ: Điều kiện sau: Nếu hàm thuần được gọi với tham số không gây ra tác dụng phụ, kết quả là hằng số đối với danh sách tham số đó (đôi khi được gọi là minh bạch tham chiếu), tức là nếu hàm thuần túy được gọi lại với cùng tham số, cùng một kết quả sẽ được trả lại (điều này có thể cho phép tối ưu hóa bộ nhớ đệm như ghi nhớ).

Mặc dù có cách giải quyết về vấn đề này (như InfantPro'Aravind ' chỉ ra), bạn không nên làm những việc như vậy; bằng cách làm điều đó, bạn đang hủy hoại một trong những lợi ích XSLT quan trọng nhất.

Các vấn đề liên quan