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