in reply to Using XML::Saxon::XSLT2 Errors

Revered monks,

XML::Saxon::XSLT2 is, as far as could see, the only Perl module on CPAN which processes stylesheets written in XSLT 2.0. It is therefore the module to use, if one wants to take advantage of the XSLT 2.0 stylesheets provided by the TEI Consortium for the transformation of xml-files structured according to the TEI Convention (http://www.tei-c.org/Tools/Stylesheets). Being the result of a decade's work and experience with TEI xml, the use of these stylesheets in a Perl environment seems quite advisable.

Users of Ubuntu 14+ are in the privileged position to simply install http://packages.ubuntu.com/trusty/perl/libxml-saxon-xslt2-perl. For the time being, I am on a Ubuntu 12 server and I am stuck with the error given below.

As the earlier error reports here (and the documentation of XML::Saxon::XSLT2) point out, one has to make sure that the module Inline::Java is installed and that the file saxonhe9.jar is present in, e.g., the directory /usr/share/java. After a good day's work, I am very sure about these two requirements. Still, my script stops in the last line given below.

use XML::Saxon::XSLT2; use Inline::Java; # not necessary my $xml_file = "/some/defintely/existing/file.xml"; my $xslt_file = "/another/definetly/existing/file.xsl"; open(my $input, '<:encoding(UTF-8)', $xml_file) or die $!; open(my $xslt, '<:encoding(UTF-8)', $xslt_file ) or die $!; my $trans = XML::Saxon::XSLT2->new($xslt);

I am getting the following errror:

Can't locate object method "new" via package "XML::Saxon::XSLT2::Transformer" (perhaps you forgot to load "XML::Saxon::XSLT2::Transformer"?) at /usr/local/share/ perl/5.14.2/XML/Saxon/XSLT2.pm line 53, <$xslt> line 1.'

The module XML::Saxon::XSLT2::Transformer doesn't exist. XSLT2.pm, line 53 reads:

    return bless { 'transformer' => XML::Saxon::XSLT2::Transformer->new($xslt) }, $class;

I would be very grateful for any idea about what could be wrong. SERVER_SOFTWARE : Apache/2.2.22 (Ubuntu). The permissons of /usr/share/java/saxonhe9.jar are: -rwxr-xr-x

Thank you!

Replies are listed 'Best First'.
Re^2: Using XML::Saxon::XSLT2 Errors
by Samantabhadra (Acolyte) on Mar 10, 2016 at 15:55 UTC
    Monks,

    in a rather solipstic continuation of solving this problem, I document the following for future stranded adepts.

    First, see what the developer of XML::Saxon::LibXSLT2 has to say on Stackoverflow

    Make sure to follow his advise verbosely. As, e.g., for the notorius saxon9he.jar, the developer has used version 9.5.1.7. If you use a version from 9.6. onwards you will get a "depricated" warning in the tests mentioned below. After replacing the recent saxon9he.jar with an earlier version this warning vanishes.

    Testing the mainly concerned modules independently is enlighting (take, e.g., XML::Saxon::XSLT2 testcase or the "Synopsis" from Inline::Java.

    I run this tests on my local PC (Ubuntu 14.04.4 LTS: trusty) and on my server (Ubuntu 12.04.5 LTS: precise). On trusty I installed the concerned modules from the repositories, on precise I installed the concerned modules manually (make file and CPAN).

    On trusty both modules work as expected, on precise the tests first result in a server error when calling the testfunction with the browser.

    "Couldn't find an appropriate DIRECTORY for Inline to use"

    Clear. Inline::Java generates at first run the directory "_Inline" in order to its magic. See "The Inline 'directory'" in Inline. By attributing appropriate permissions to the _Inline directory this particular server error vanishes. (I attributed "drwxrwxrwx".)

    With this, the test is successfull from the terminal. But while on trusty the output is printed as desired, on precise the terminal prints "XML::LibXML::Document=SCALAR(0x2a0d6f8)" instead and by calling the testfunction with the browser I stuck again with the error:

    "Can't locate object method "new" via package "XML::Saxon::XSLT2::Transformer ... XSLT2.pm, line 53, line 6".

    Line 53 of XSLT2.pm reads:

    return bless { 'transformer' => XML::Saxon::XSLT2::Transformer->new($xslt) }, $class;

    It looks like the java function in XSLT2.pm, line 377 is not accessed porperly. But why?

    TobyInk, the developer of the module mentions in his comment on stackoverflow (see link above), that the JAVA_HOME environment is needed to be set.

    "echo $JAVA_HOME" remains silent on both, trusty and precise. However, I set JAVA_HOME anyway (with this how to). Still, the same error.

    Any help greatly appreciated.

      Stupid question, but is java even installed?
        Every reply is highly welcome. java -version:
        java version "1.8.0_74" Java(TM) SE Runtime Environment (build 1.8.0_74-b02) Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)

      I had also the error like "Can't locate object method "new" via package "XML::Saxon::XSLT2::Transformer ... XSLT2.pm ..."

      In my case the problem was that the XSLT2 related code was located in a .pm module.

      The error disappeared when I added use XML::Saxon::XSLT2; not only to the .pm module but also into the main perl script.