2009-09-05 50 views
5

Tôi là người mới với XSLT, và tôi đã thực hiện chuyển đổi cơ bản. Tiếp theo tôi muốn thử các thao tác ngày, vì dữ liệu của tôi sẽ có dấu thời gian. Tuy nhiên, tôi dường như không thể có được bất kỳ chức năng ngày nào để làm việc, và nó làm tôi thất vọng. Tôi đang thử nghiệm bằng cách sử dụng Firefox 3.5, xsltproc 1.1.24, xalan 1.10 và XMLSpy 2009 và tất cả đều nói rằng các chức năng tôi đang cố sử dụng không tồn tại.Chức năng và không gian tên XSLT

xml của tôi trông giống như vậy:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="datetime.xsl"?> 

<watcher> 
    <event id="1" date="2009-09-04T13:49:10-0500" type="ABCD">This is a test </event> 
</watcher> 
</code> 

xsl tôi trông giống như vậy:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:fn="http://www.w3.org/2005/02/xpath-functions" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xsl:template match="event[@type='ABCD']"> 
<!--   Date: <xsl:value-of select="day-from-dateTime(xs:dateTime(@date))"/> --> 
<!--   Date: <xsl:value-of select="day-from-dateTime(@date)"/> --> 
       Date: <xsl:value-of select="fn:day-from-dateTime(@date)"/> 
</xsl:template> 

</xsl:stylesheet> 

Nếu tôi làm cho phiên bản stylesheet 2, XMLSpy phàn nàn rằng nó không thể đúc ngày của tôi: XSLT 2.0 Debugging Error: Error in XPath 2.0 expression (Cast failed, invalid lexical value - xs:dateTime '2009-09-04T13:49:10-0500')

Nếu tôi rời khỏi phiên bản 1, nó khiếu nại về một lỗi khác: XSLT 1.0 Debugging Error: Error in XPath expression (Unknown function - Name and number of arguments do not match any function signature in the static context - 'day-from-dateTime')

Bất cứ lúc nào tôi cố gắng thay đổi XSL để sử dụng không gian tên, chẳng hạn như fn: day-from-dateTime, nó từ chối làm việc, với tất cả các trình phân tích cú pháp của tôi nói rằng The function number 'http://www.w3.org/2005/02/xpath-functions:day-from-dateTime' is not available và các biến thể của chúng. Tôi biết từ các bài kiểm tra khác mà tôi có thể sử dụng hàm substring() một cách hoàn hảo, mà không cần bất kỳ tiền tố không gian tên nào, và tôi tin rằng nó nằm trong cùng một không gian tên như day-from-dateTime.

Tôi cảm thấy nó là thứ gì đó cực kỳ dễ dàng, vì tất cả các hướng dẫn đều hiển thị các chức năng đang được sử dụng, nhưng có vẻ như đang làm tôi khó chịu. Ai đó có thể chỉ cho tôi những gì tôi đang thiếu?

Trả lời

7

Các phiên bản khó chịu, khó chịu đang diễn ra ở đây. Rất nhiều vấn đề bạn thấy sẽ là do bộ xử lý XSLT mà bạn đang sử dụng không hỗ trợ XPath 2.0, đó là nơi hàm ngày-từ-dateTime đến từ đó.

Tôi có thể nhận được những gì bạn đang cố gắng làm để làm việc, với một bộ vi xử lý của tôi thay vì Xalan là Saxon processor - Saxon-B 9.1.0.6. (Xalan xuất hiện để hỗ trợ XPath 1.0 chỉ, theo documentation)

Có một vài sai sót trong tài liệu của bạn:

Các tài liệu nguồn nên có múi giờ như 5:00, không 0500

<?xml version="1.0" encoding="UTF-8"?> 
<watcher> 
    <event id="1" date="2009-09-04T13:49:10-05:00" type="ABCD">This is a test </event> 
</watcher> 

XSLT sẽ bỏ chuỗi 2009-09-04T13: 49: 10-05: 00 vào xs: dateTime, là kiểu đối số của ngày-từ-dateTime cần phải có.

Date: <xsl:value-of select="day-from-dateTime(xs:dateTime(@date))"/> 

Và sau đó nó hoạt động

<?xml version="1.0" encoding="UTF-8"?> 



     Date: 4 

Hy vọng rằng sẽ giúp,

+0

Sau khi thay đổi định dạng ngày và XSL mỗi đề xuất của bạn, XMLSpy hoạt động. Tuy nhiên, Firefox và tiện ích CLI của tôi vẫn phàn nàn rằng hàm không tồn tại. xsltproc không biết bất kỳ hàm nào, mặc dù tôi đã nghe nó không hỗ trợ XSLT 2. Xalan chỉ phàn nàn về day-from-dateTime, chứ không phải xs: dateTime(). Làm thế nào để tôi cần không gian tên cho xs, nhưng không phải cho fn? – hufman

+1

OK - theo hiểu biết tốt nhất của tôi: Xalan chỉ hỗ trợ XPath 1.0, có nghĩa là không biết về hàm được gọi là day-from-dateTime. Bộ vi xử lý hỗ trợ XPath 2.0 có ngày-từ-dateTime được xây dựng trong, vì vậy bạn có thể khai báo một tiền tố không gian tên và URI một cách rõ ràng, hoặc chỉ sử dụng tên hàm như được xây dựng trong. Bạn cần tiền tố không gian tên cho các kiểu dữ liệu vì nó không được tích hợp sẵn giống như các hàm XPath 2.0. – Brabster

+2

Trừ khi bạn chỉ sử dụng các thư viện hỗ trợ XPath 2.0, bạn sẽ gặp sự cố khi sử dụng các bản dựng sẵn XPath 2.0. Nếu bạn không thể sử dụng độc quyền các thư viện XPath 2.0, bạn có thể tạo một thư viện hàm tùy chỉnh để thực hiện lại chức năng xử lý ngày tháng và thời gian bạn cần. Tôi nghĩ FunctX có thể giúp ở đây. http://www.xqueryfunctions.com/xq/fn_day-from-datetime.html – Brabster

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