Я как бы новый для 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.
Мне кажется, что это невероятно просто, так как все учебные пособия показывают, что функции используются, но что-то вроде меня ускользает. Может ли кто-нибудь показать мне, что мне не хватает?
После изменения формата даты и XSL за ваши предложения, XMLSpy работы. Однако Firefox и мои утилиты CLI все еще жалуются, что функция не существует. xsltproc не знает ни одной из функций, хотя я слышал, что он не поддерживает XSLT 2. Xalan только жалуется на day-to-dateTime, а не xs: dateTime(). Почему мне нужно пространство имен для xs, но не для fn? – hufman
OK - насколько мне известно: Xalan поддерживает только XPath 1.0, а это значит, что он не знает о функции, называемой day-to-dateTime. Процессоры, поддерживающие XPath 2.0 имеют встроенный день в день, поэтому вы можете объявить префикс пространства имен и URI явно или просто использовать имя функции, поскольку оно встроено. Вам нужен префикс пространства имен для типов данных, потому что он не встроен в так же, как и функции XPath 2.0. – Brabster
Если вы используете только поддерживающие библиотеки XPath 2.0, у вас возникнут проблемы с использованием встроенных систем XPath 2.0. Если вы не можете использовать исключительно библиотеки XPath 2.0, вы можете создать специальную библиотеку функций, которая повторно использует функциональность обработки даты и времени, в которой вы нуждаетесь. Я думаю, FunctX может помочь здесь. http://www.xqueryfunctions.com/xq/fn_day-from-datetime.html – Brabster