2016-11-28 9 views
0

У меня есть довольно последняя версия 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> 
+0

Вы забыли предоставить код и данные, которые выдают этот результат ... – ikegami

+0

Не уверен, что это имеет значение, но 'extension-element-prefixes =" exsl "' должно быть 'extension-element-prefixes =" exsl date ". –

ответ

0

Пожалуйста, выполните следующую таблицу стилей (на любом входе) и сообщить результат:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:date="http://exslt.org/dates-and-times" 
extension-element-prefixes="date"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 
    <test> 
     <proc> 
      <xsl:value-of select="system-property('xsl:vendor')"/> 
     </proc> 
     <year> 
      <xsl:value-of select="function-available('date:year')"/> 
     </year> 
    </test> 
</xsl:template> 

</xsl:stylesheet> 

Не ответ, а необходимое пространство.

+0

При запуске скрипта результат не отображается. :( – Recker

+0

Это очень странно - повторите попытку с обновленной таблицей стилей. –

+0

Я получил результат после того, как я изменил свой скрипт на Perl, чтобы использовать API 'output_as_bytes'. Результатом является' libxslt' и 'false'. – Recker