У меня есть довольно последняя версия Perl установлен на моемPerl 5.20.2 с LibXSLT 1,94 ошибкой
OS X машине
% uname -a
Darwin X-maci 15.6.0 Darwin Kernel Version 15.6.0: Thu Jun 23 18:25:34 PDT 2016; root:xnu-3248.60.10~1/RELEASE_X86_64 x86_64
следующего
% /$path/perl -v
This is perl 5, version 20, subversion 2 (v5.20.2) built for darwin-thread-multi-2level
Copyright ....
У меня также есть последняя версия LibXSLT установлены следующим образом:
% /$path/perl -MXML::LibXSLT -le 'print $XML::LibXSLT::VERSION'
1.94
и я также получаю
% /$path/perl -MXML::LibXSLT -le 'print XML::LibXSLT::HAVE_EXSLT()'
1
Я уже задавал this question объяснить мой случай использования. По существу, я пытаюсь получить доступ к расширениям EXSL (exsl:date-year(),exsl:document
) в моем XSL-файле. Поскольку в то время у меня была довольно старая версия Perl и libXSLT, не было разрешения проблемы.
Теперь я обновил свои версии Perl и LibXSLT и до сих пор я получаю сообщение об ошибке, когда я пытаюсь использовать расширение (ы)
xmlXPathCompOpEval: function year not found
Unregistered function
xmlXPathCompiledEval: evaluation failed
runtime error: file trans.xsl line 14 element value-of
XPath evaluation returned no result.
at Transform.pl line 43.
Это известная проблема с выше OSX + Perl + LibXSLT версии сочетание?
PS: Интересно, что this page не упоминает результаты darwin-thread-multi-2level
для version 5.20.2
.
файл UPDATE
1) Perl
use strict;
use warnings;
use File::Path;
use File::Spec;
use File::Basename;
use XML::LibXSLT;
use XML::LibXML;
use Getopt::Std;
my $isfile;
my ($xmlfile,$xsltfile,$samplefile) = qw/ Example.xml trans.xsl sample.xml/;
my %opts =();
getopts('o:',\%opts);
my $outPath = $opts{'o'};
die "File not specified" if !defined($outPath);
if(-f $samplefile)
{
$isfile = "true";
print "File is present\n";
}
else
{
$isfile = "false";
print "File is absent\n";
}
my %args = ("isfile" => $isfile,"outpath" => $outPath,);
my $xslt = XML::LibXSLT->new;
my $stylesheet = $xslt->parse_stylesheet_file($xsltfile);
my $security = XML::LibXSLT::Security->new();
$security->register_callback(read_file => sub { return 1;});
$security->register_callback(write_file => sub { return 1;});
$security->register_callback(create_dir => sub { return 1;});
$stylesheet->security_callbacks($security);
XML::LibXSLT->register_function("urn:foo", "bar",\&invalue);
my $results = $stylesheet->transform_file($xmlfile,XML::LibXSLT::xpath_to_string(%{args}));
sub invalue
{
my $var = shift;
return $var + 2;
}
0;
2) XSL файл
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xalan="http://xml.apache.org/xslt"
xmlns:exsl="http://exslt.org/common"
xmlns:date="http://exslt.org/dates-and-times"
xmlns:foo="urn:foo"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" media-type="text/xml"/>
<xsl:param name="isfile"/>
<xsl:param name="outpath"/>
<xsl:variable name="current-year">
<xsl:value-of select="date:year()"/>
</xsl:variable>
<xsl:template match="/">
<xsl:if test="$isfile = 'true'">
<exsl:document href = "{$outpath}" method="xml" version="1.0" encoding="UTF-8" indent="yes">
Article:- <xsl:value-of select="exsl:node-set(/Article/Title)|exsl:node-set(/Article/Title)/@context"/>
Authors:- <xsl:apply-templates select="/Article/Authors/Author"/>
Perl function Output :- <xsl:value-of select="foo:bar(234)"/>
</exsl:document>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Вы забыли предоставить код и данные, которые выдают этот результат ... – ikegami
Не уверен, что это имеет значение, но 'extension-element-prefixes =" exsl "' должно быть 'extension-element-prefixes =" exsl date ". –