2014-09-03 4 views
0

Я пытаюсь получить простое преобразование XSLT 2.0, работающее с использованием perl и XML :: Saxon :: XSLT2. Вот что я пытался до сих пор:Преобразование XHTML с XML :: Saxon :: XSLT2

test.xhtml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>My Title</title> 
    </head> 
    <body> 
     <p>My Content</p> 
    </body> 
</html> 

test.xslt:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    version="2.0"> 
    <xsl:template match="/"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

xslttest.pl:

use strictures; 
use diagnostics; 
use XML::Saxon::XSLT2; 
use XML::LibXML; 

my $parser = XML::LibXML->new; 
my $xsl = 'test.xslt'; 
my $xslt = $parser->load_xml(location => $xsl); 
my $dom = $parser->load_xml(location => 'test.xhtml'); 
my $trans = XML::Saxon::XSLT2->new($xslt); 
my $output = $trans->transform($dom, 'xhtml'); 
print $output; 

Выход locate saxon9he.jar:

/usr/local/share/java/saxon9he.jar 
/usr/share/java/saxon9he.jar 

Теперь, если я бегу perl xslttest.pl, я получаю:

Uncaught exception from user code: 

    A problem was encountered while attempting to compile and install your Inline 
    Java code. The command that failed was: 
     "/usr/lib/jvm/default-java/bin/javac" -deprecation -d "/tmp/perltest/_Inline/lib/auto/XML/Saxon/XSLT2_dbc0" Transformer.java > cmd.out 2>&1 

    The build directory was: 
    /tmp/perltest/_Inline/build/XML/Saxon/XSLT2_dbc0 

    The error message was: 
    Transformer.java:1: error: package net.sf.saxon.s9api does not exist 
    import net.sf.saxon.s9api.*; 
    ^
    Transformer.java:29: error: cannot find symbol 
     private XsltExecutable xslt; 
       ^
     symbol: class XsltExecutable 
     location: class Transformer 
    Transformer.java:30: error: cannot find symbol 
     private Processor proc; 
       ^
     symbol: class Processor 
     location: class Transformer 
    Transformer.java:31: error: cannot find symbol 
     private HashMap<String, XdmAtomicValue> params; 
           ^
    (...) 

версия Perl (результат perl -v):

This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi 
(with 41 registered patches, see perl -V for more detail) 
(...) 

Почему преобразование потерпеть неудачу? Кажется, что Inline :: Java не скомпилирует требуемый код (???), но как этого избежать?

EDIT:

В net.sf.saxon.s9api.* классы обеспечиваются самой saxon9he.jar:

$ jar tvf /usr/share/java/saxon9he.jar | grep net.sf.saxon.s9api 
    0 Wed Aug 06 10:34:58 CEST 2014 net/sf/saxon/s9api/ 
    1805 Wed Aug 06 10:34:58 CEST 2014 net/sf/saxon/s9api/Axis.class 
    302 Wed Aug 06 10:34:58 CEST 2014 net/sf/saxon/s9api/BuildingContentHandler.class 
    421 Wed Aug 06 10:34:58 CEST 2014 net/sf/saxon/s9api/BuildingStreamWriter.class 
    1207 Wed Aug 06 10:34:58 CEST 2014 net/sf/saxon/s9api/BuildingStreamWriterImpl.class 
    2025 Wed Aug 06 10:34:58 CEST 2014 net/sf/saxon/s9api/ConstructedItemType.class 
    1130 Wed Aug 06 10:34:58 CEST 2014 net/sf/saxon/s9api/DOMDestination.class 
    303 Wed Aug 06 10:34:58 CEST 2014 net/sf/saxon/s9api/Destination.class 
    1367 Wed Aug 06 10:34:58 CEST 2014 net/sf/saxon/s9api/DocumentBuilder$BuildingContentHandlerImpl.class 
    8981 Wed Aug 06 10:34:58 CEST 2014 net/sf/saxon/s9api/DocumentBuilder.class 
    455 Wed Aug 06 10:34:58 CEST 2014 net/sf/saxon/s9api/ExtensionFunction.class 
(...) 
+0

Установили ли вы библиотеку net.sf.saxon.s9api? – choroba

+0

@choroba: Спасибо за ваш комментарий - 'net.sf.saxon.s9api. *' Является частью 'saxon9he.jar', поэтому он должен быть доступен для' Inline :: Java'. – tohuwawohu

+0

http://www.perlmonks.org/?node_id=612894 может быть? – choroba

ответ

1

Ваш скрипт работает для меня, и производит следующий вывод:

<?xml version="1.0" encoding="UTF-8"?><html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
     <title>My Title</title> 
    </head> 
    <body> 

     <p>My Content</p> 

    </body> 
</html> 

(Хотя это не точно так же быстро. Я забыл, как медленно работал Inline :: Java.)

Я установлены следующие компоненты (на Ubuntu 14.04):

  • Perl 5.20
  • OpenJDK Runtime Environment (IcedTea 2.5.1) (7u65-2.5.1-4ubuntu1 ~ 0.14.04.2), установленный в /usr/lib/jvm/java-7-openjdk-i386/
  • Saxon HE 9.5.1.7, расположенный в /usr/share/java/saxon9he.jar
  • Inline :: Java 0,53
  • XML :: саксонской :: XSLT2 0,007

У вас есть похожие версии? Вы правильно установили Inline :: Java (вам нужно установить переменную среды JAVA_HOME). Вы проводили тесты, которые пришли с ним? Они прошли? (Если вы использовали CPAN-клиент для установки Inline :: Java, он обычно запускает тестовые примеры и только устанавливает модуль, если он прошел, если вы явно не переопределите это поведение.)

Аналогичным образом, вы запустили test case that comes with XML::Saxon::XSLT2? Прошло ли это? (Потому что он делает что-то довольно похожее на ваш тестовый скрипт.)

+0

О, это интересно. Я использую oracle java, и я установил все модули perl, используя пакеты deb (через synaptic). Может быть, я должен удалить их и использовать cpan. – tohuwawohu

+0

Я установил пакет через диспетчера системных пакетов, вы доверяете человеку, который их упаковал, чтобы проверить их достаточно. (Упаковщики Debian, как правило, очень хороши.) Вместо того, чтобы удалять эти пакеты и переустанавливать их из CPAN, вы можете попробовать загрузить tarballs, извлечь тестовые пакеты и запустить их из командной строки. (Для этого просто 'cd' в корневой каталог tarball и выполните' prov -rv 't/"'.) – tobyink

+0

Спасибо - я сделаю это. Я ценю вашу помощь! – tohuwawohu

Смежные вопросы