Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Using XML::Saxon::XSLT2 Errors

by Anonymous Monk
on Jun 27, 2013 at 20:22 UTC ( #1041092=perlquestion: print w/ replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I am currently trying to use the XSLT2 module in a perl script. I am currently getting an error when running the script due to including this module. The main error statement is "Transformer.java:1: error: package net.sf.saxon.s9api does not exist". I'm assuming this means that when I installed XML::Saxon::XSLT2, it didn't know where the Saxon jar file was. I have it on my computer but I'm not sure how to get Inline::Java or XSLT2 to recognize that it's there or install it or do whatever I have to do. Sorry, I don't really know too much about Java and classpaths and what not so I'm sort of in the black on this issue.

Comment on Using XML::Saxon::XSLT2 Errors
Re: Using XML::Saxon::XSLT2 Errors
by runrig (Abbot) on Jun 27, 2013 at 21:01 UTC
    I see this code in the source for the library (XML/Saxon/XSLT2.pm):
    foreach my $path (qw( /usr/share/java/saxon9he.jar /usr/local/share/java/saxon9he.jar /usr/share/java/saxonb.jar /usr/local/share/java/saxonb.jar)) { $classpath = $path if -e $path; last if defined $classpath; }

    It looks like it expects the jar file in one of those paths. If your jar file is not in any of those, go ahead and edit the source and add your path to the list. That's my guess anyway...

    If I were to rewrite this, I would make it configurable via (at least) some environment variable, maybe SAXON_LIB_PATH or something...rather than just a hard coded list of paths

      Where are those paths? In my Java directory or in my Strawberry Perl one? Also, if I want it to just reference a path inside the module folder then how would I go about doing that?

        They're absolute paths. So on Windows, you'd probably want something starting with "C:\..."

        package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name

      It is already configurable. Look a few lines further down at the import method:

      sub import { my ($class, @args) = @_; shift @args if @args && exists $args[0] && defined $args[0] && $args[0] =~ + /^[\d\.\_]{1,10}$/; Inline->import(Java => 'DATA', CLASSPATH=>$classpath, @args); }

      So the CLASSPATH => $classpath can be overridden by passing arguments to import a la:

      use XML::Saxon::XSLT2 CLASSPATH => "/path/to/saxonb.jar";

      There is an example of providing arguments to the import method in the documentation (though not the CLASSPATH argument).

      However I've not played with it much. If your application contains multiple instances of "use XML::Saxon::XSLT2" it's probably only the first one that counts. To be sure, you can supply the path on the command line like:

      perl -MXML::Saxon::XSLT2=CLASSPATH,/path/to/saxonb.jar myscript.pl

      PS: patches would be appreciated for this issue (or indeed for RT#66278 which is a long running one).

      package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name
        Ah, I was misled by this comment in the docs:
        It expects Saxon to be installed in either '/usr/share/java/saxon9he.jar' or '/usr/local/share/java/saxon9he.jar'.

        Anyway, I'm unlikely to submit any patches since I'm not the one trying to use the library :-)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1041092]
Approved by runrig
Front-paged by runrig
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (13)
As of 2014-07-31 18:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (250 votes), past polls