2009-03-13 25 views
12

Tôi có một XML với timestamps như thế này:Làm thế nào để chuyển đổi bọ ve thành một datetime có thể đọc được với XSLT?

<node stamp="1236888746689" /> 

Và tôi muốn hiển thị chúng trong HTML kết quả như ngày theo thời gian. Có cách nào để làm điều đó với XSLT (bất kỳ Phiên bản nào) không?

EDIT: Tôi đang sử dụng XSLT2.0 với Saxon9. Ngày cơ sở là 1970-01-01 0:00.

+0

Về mặt kỹ thuật có thể, nhưng không hiệu quả và cần thêm đầu vào (như định nghĩa về thời gian không). Tôi sẽ bó này ra một phần mở rộng - nền tảng của bạn là gì? – annakata

Trả lời

13

Bạn lấy ngày 1970-01-01T00:00:00 và thêm bao nhiêu mili giây như giá trị của tem cho bạn:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://www.w3.org/TR/xhtml1/strict"> 

    <xsl:template match="node"> 
     <xsl:value-of 
select='xs:dateTime("1970-01-01T00:00:00") + @stamp * xs:dayTimeDuration("PT0.001S")'/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Làm cách nào để sửa đổi câu trả lời để sử dụng văn bản bên trong trong một nút, thay vì một thuộc tính trên đó? – Broam

+0

@Broam Quấn ' '. –

0

XSLT là Turing complete, vì vậy phải có cách. :) Biết ít nhất một chút XSLT, nó có thể sẽ liên quan đến đệ quy.

Bạn không chỉ định cách diễn giải chính xác các "dấu tích" của mình, tôi đoán là mili giây từ một số thời đại, nhưng cái nào? 1970?

1

Nếu bạn muốn sử dụng một bộ xử lý XSL 1.0 không hỗ trợ các EXSLT date and time functions này là không tầm thường , nhưng nó đã được thực hiện.

Bạn có thể xem Katy Coe's XSLT 1.0 implementation of the "iso-from-unix" function. Đó là một phần của một tập hợp các chức năng ngày và giờ khá miễn phí mà cô đã tạo ra.

Tuy nhiên, bộ xử lý XSL của bạn phải hỗ trợ không gian tên "http://exslt.org/functions" để triển khai này hoạt động. Ngoài ra, không có sự phụ thuộc vào EXSLT.

P .: Tôi biết rằng dấu thời gian và dấu thời gian Unix không phải là chính xác là điều tương tự. Họ là đủ gần, mặc dù.

8

Nếu bạn đang sử dụng một XSLT 1.0 bộ xử lý hỗ trợ các EXSLT date functions (Tôi vừa mới được thử nghiệm này với libxslt trong PHP), bạn có thể sử dụng date:add()date:duration():

<xsl:value-of select="date:add('1970-01-01T00:00:00Z', date:duration(@stamp div 1000))"/> 

Chức năng date:duration() mất một số giây (vì vậy bạn phải chia mili giây cho 1000) và biến nó thành "thời lượng" (trong trường hợp này là "P14315DT20H12M26.6889998912811S"), sau đó được thêm vào đầu kỷ nguyên của bạn (trông giống như kỷ nguyên chuẩn, cho dấu này) với date:add() để lấy dấu "2009-03-12T20:12:26.6889998912811Z". Sau đó, bạn có thể định dạng điều này bằng các hàm ngày EXSLT hoặc chỉ substring(), tùy thuộc vào những gì bạn cần.

4

Câu trả lời có liên quan, vâng, tôi biết, nhưng tôi không thể tìm thấy cái mà tôi đang tìm kiếm ở đây, vì vậy tôi nghĩ tôi sẽ trả nó với giải pháp của mình.

XML của tôi là một vài nút được đổ từ Drupal bằng cách sử dụng export_node và drush. Tôi đã sử dụng bộ xử lý xslt trong PHP5, chỉ hỗ trợ xslt 1.0. Một số hàm EXSLT dường như được hỗ trợ, nhưng tôi không thể biết cú pháp của tôi sai hay hàm tôi đang cố sử dụng không được hỗ trợ. Dù sao, sau đây đã làm việc cho tôi. Tôi đã sử dụng mã ví dụ từ w3schools.com, nhưng đã thêm một dòng ngay sau khi khai báo xsltprocessor, như sau:

$ xp = new XsltProcessor();
$ xp-> registerPHPFunctions();

PHP có chức năng nhỏ để chuyển đổi ngày, vì vậy tôi đã lừa và sử dụng bộ xử lý PHP, vì tôi đã sử dụng nó để chuyển đổi xsl của mình.

<xsl:for-each select="node_export/node"> 
    <xsl:value-of select="php:function('date', 'n-j-y', number(timestamp))"/> 
</xsl:for-each> 

Hy vọng điều này sẽ giúp ai đó ở ngoài đó. Tôi đã đập đầu của tôi trong một thời gian khi tôi làm việc này ra.

+1

Tôi cũng thấy rằng tôi cần sử dụng điều này: '' – kenny

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