2009-09-05 2 views
5

Я как бы новый для XSLT, и я получил базовое преобразование. Затем я хочу опробовать манипуляции с датами, поскольку мои данные будут иметь временные метки. Тем не менее, я не могу заставить работать какие-либо функции, и это сильно меня разочаровывает. Я тестирую, используя Firefox 3.5, xsltproc 1.1.24, xalan 1.10 и XMLSpy 2009, и все говорят, что функции, которые я пытаюсь использовать, не существуют.Функции и пространства XSLT

Мой XML выглядит так:

<?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 выглядит так:

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

Если я делаю таблицы стилей версии 2, XMLSpy жалуется, что не может бросить свою дату: XSLT 2.0 Debugging Error: Error in XPath 2.0 expression (Cast failed, invalid lexical value - xs:dateTime '2009-09-04T13:49:10-0500')

Если я оставляю его как версию 1, он жалуется на другую ошибку: 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')

В любое время, когда я пытаюсь изменить XSL для использования пространства имен, например fn: day-to-dateTime, он отказывается работать вообще, причем все мои парсеры говорят, что The function number 'http://www.w3.org/2005/02/xpath-functions:day-from-dateTime' is not available и их варианты. Я знаю из других тестов, что могу отлично использовать функцию substring(), не требуя какого-либо префикса пространства имен, и я считаю, что он находится в том же пространстве имен, что и day-to-dateTime.

Мне кажется, что это невероятно просто, так как все учебные пособия показывают, что функции используются, но что-то вроде меня ускользает. Может ли кто-нибудь показать мне, что мне не хватает?

ответ

7

Ой, неприятные версии вещь происходит здесь. Многие проблемы, которые вы видите, будут связаны с тем, что XSLT-процессор, который вы используете, не поддерживает XPath 2.0, откуда приходит функция day-to-dateTime.

Я могу получить то, что вы пытаетесь сделать для работы, с Saxon processor - Saxon-B 9.1.0.6 в качестве моего процессора вместо Xalan. (Xalan кажется, поддерживает только XPath 1.0, в соответствии с documentation)

Есть несколько ошибок в документах:

Документ-источник должен иметь часовой пояс в 05:00, а не 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 должен отличать строку 2009-09-04T13: 49: 10-05: 00 в xs: dateTime, что является типом аргумента day-to-dateTime.

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

А потом он работает

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



     Date: 4 

Надежда, что помогает,

+0

После изменения формата даты и XSL за ваши предложения, XMLSpy работы. Однако Firefox и мои утилиты CLI все еще жалуются, что функция не существует. xsltproc не знает ни одной из функций, хотя я слышал, что он не поддерживает XSLT 2. Xalan только жалуется на day-to-dateTime, а не xs: dateTime(). Почему мне нужно пространство имен для xs, но не для fn? – hufman

+1

OK - насколько мне известно: Xalan поддерживает только XPath 1.0, а это значит, что он не знает о функции, называемой day-to-dateTime. Процессоры, поддерживающие XPath 2.0 имеют встроенный день в день, поэтому вы можете объявить префикс пространства имен и URI явно или просто использовать имя функции, поскольку оно встроено. Вам нужен префикс пространства имен для типов данных, потому что он не встроен в так же, как и функции XPath 2.0. – Brabster

+2

Если вы используете только поддерживающие библиотеки XPath 2.0, у вас возникнут проблемы с использованием встроенных систем XPath 2.0. Если вы не можете использовать исключительно библиотеки XPath 2.0, вы можете создать специальную библиотеку функций, которая повторно использует функциональность обработки даты и времени, в которой вы нуждаетесь. Я думаю, FunctX может помочь здесь. http://www.xqueryfunctions.com/xq/fn_day-from-datetime.html – Brabster

Смежные вопросы