exsl:дата-год в OS X

Как упоминалось в этом вопросе, я пытаюсь преобразовать входной XML-документ с помощью Perl и libXSLT. Однако, когда я пытаюсь запустить тот же сценарий Perl в OS X с небольшим добавлением следующего в моем файле xsl под

 <xsl:variable name="current-year">
            <xsl:value-of select="date:year()"/>
    </xsl:variable>

Я получаю следующую ошибку.

xmlXPathCompOpEval: function year not found
Unregistered function
xmlXPathCompiledEval: evaluation failed
runtime error: file trans.xsl line 24 element value-of
XPath evaluation returned no result.

Заголовок моего файла XSLT имеет следующее

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xalan="http://xml.apache.org/xslt"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:exsl="http://exslt.org/common"
    xmlns:date="http://exslt.org/dates-and-times"
    extension-element-prefixes="exsl">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" media-type="text/xml"/>

Запуск Perl -v приводит меня к подписке

This is perl, v5.8.8 built for darwin-thread-multi-2level Copyright 1987-2006, Larry Wall....

и запуск uname -a приводит меня к следующему

Darwin machine-maci 15.3.0 Darwin Kernel Version 15.3.0: Thu Dec 10 18:40:58 PST 2015; root:xnu-3248.30.4~1/RELEASE_X86_64 x86_64

Почему появляется эта ошибка? Я думал, что поставщик OS X уже имеет расширения exsl для своего libXSLT. Расширения exsl еще не поддерживаются?

ОБНОВЛЕНИЕ

Я немного подправил свой пример и получил вывод как Vendor:-libxslt, как было предложено в комментариях ниже.


person Recker    schedule 06.09.2016    source источник
comment
Ссылка на Safari не имеет значения, если вы запускаете libxslt через командную строку или Perl. В любом случае, я не могу воспроизвести вашу проблему. Что вы получаете в результате <xsl:value-of select="system-property('xsl:vendor')"/>?   -  person michael.hor257k    schedule 06.09.2016
comment
Я получил следующую ошибку в строке, где я пытаюсь использовать exsl:document (ниже которой я использую system-property согласно вашему предложению) runtime error: file trans.xsl line 30 element document xsltApplySequenceConstructor: failed to find extension document   -  person Recker    schedule 06.09.2016
comment
Я не припоминаю, чтобы рекомендовал вам включать exsl:document (или что-то еще) в этот тест. В любом случае, я предлагаю вам отредактировать свой вопрос и предоставить полные пошаговые инструкции, как воспроизвести вашу проблему - см.: минимальный воспроизводимый пример.   -  person michael.hor257k    schedule 06.09.2016
comment
@ michael.hor257k Я немного подправил свой пример и получил вывод как Vendor :- libxslt   -  person Recker    schedule 06.09.2016
comment
Каков результат perl -MXML::LibXSLT -le 'print $XML::LibXSLT::VERSION' и perl -MXML::LibXSLT -le 'print XML::LibXSLT::HAVE_EXSLT()'?   -  person nwellnhof    schedule 06.09.2016
comment
@nwellnhof Выходы 1.62 и Can't locate auto/XML/LibXSLT/HAVE_EXSLT.al in @INC (@INC contains: ....all the Perl directories... .) at -e line 1 соответственно.   -  person Recker    schedule 06.09.2016
comment
Это старая версия XML::LibXSLT от 2006 года. Возможно, она не была скомпилирована с поддержкой EXSLT, но трудно сказать, потому что функция HAVE_EXSLT была добавлена ​​позже.   -  person nwellnhof    schedule 06.09.2016


Ответы (1)


Вы также должны объявить дату как элемент расширения:

extension-element-prefixes="exsl date"

Ваше объявленное пространство имен xalan, вероятно, не понадобится при использовании libxslt. В противном случае это, вероятно, пришлось бы добавить и к префиксам элементов расширения.

person Stefan Hegny    schedule 06.09.2016
comment
Я все еще получаю ту же ошибку, даже когда добавляю дату к extension-element-prefixes. :( - person Recker; 06.09.2016
comment
Hm libxslt doc заявляет, что он также реализует большую часть набора EXSLT функций переносимых процессором расширений, и на странице exslt libxslt указан как разработчик даты: год ... Кстати, вы могли бы написать <xsl:variable name="current-year" select="date:year()"/> - Может быть, лучше последовать предложению michael.hor257k опубликовать полный (минимальный) пример - person Stefan Hegny; 06.09.2016
comment
Я на самом деле подправил свой пример и получил результаты его предложений. Пожалуйста, смотрите мой последний комментарий. - person Recker; 06.09.2016
comment
хорошо, я не понимаю, почему это не должно работать в данный момент - person Stefan Hegny; 06.09.2016