2012-06-12 2 views
1

Не могли бы вы помочь мне со следующей проблемой?Saxon перестает работать после установки батик-растеризатора

Вчера я пытался добавить процесс в свой ANT-скрипт (Windows XP, ANT версии 1.8.2, в основном XSLT 2.0, Saxon 9 просто добавлен в мой муравей/lib), благодаря чему он конвертирует каталог SVG в PDF-файлы, используя Растеризантаска Батика. Первоначально у меня было много проблем с получением ANT для распознавания растеризантаски, но после переустановки Batik из источника и с помощью следующей ссылки я смог заставить ее работать.

https://mail-archives.apache.org/mod_mbox/xmlgraphics-batik-users/200605.mbox/%[email protected]%3E

Хотя эти инструкции не указывается, чтобы сделать это, я обнаружил, что мне нужно было перекомпилировать/восстановить rasterizertask.jar.

В качестве дополнительной заметки я также добавил путь к классам batik-rasterizer.jar и rasterizertask для своего CLASSPATH, как рекомендовано на официальном сайте Batik.

И у меня была задача растеризатора. Увы, все мои задачи XSLT 2.0, которые последовали за rasterizertask в моем ANT-скрипте, перестали работать. Из того, что я мог сказать, что-то, что я сделал, вызвало изменение XSLT-процессора по умолчанию на Xalan-j. И Xalan не поддерживает большую часть моего XSLT.

Например, это ошибка, я получаю от Xalan (я знаю, почему я получаю эту ошибку, поэтому я использую Saxon):

[xslt] Processing D:\workDirs\PLMXML2HeirarchalXML\source\plmxml.xml to D:\workDirs\PLMXML2HeirarchalXML\target\step1.xml 
[xslt] Loading stylesheet D:\workDirs\PLMXML2HeirarchalXML\stylesheets\step1.xsl 
[xslt] D:\workDirs\PLMXML2HeirarchalXML\stylesheets\step1.xsl:10:16: Warning! Created using: Apache Software Foundation, http://xml.apache.org/xalan-j 
[xslt] D:\workDirs\PLMXML2HeirarchalXML\stylesheets\step1.xsl:10:16: Warning! Created using: Apache Software Foundation, http://xml.apache.org/xalan-j 
[xslt] Processing D:\workDirs\PLMXML2HeirarchalXML\target\step1.xml to D:\workDirs\PLMXML2HeirarchalXML\target\step2.xml 
[xslt] Loading stylesheet D:\workDirs\PLMXML2HeirarchalXML\stylesheets\step2.xsl 
[xslt] D:\workDirs\PLMXML2HeirarchalXML\stylesheets\step2.xsl:134:53: Fatal Error! java.lang.ClassCastException: org.apache.xpath.objects.XRTreeFrag cannot be cast to org.apache.xpath.objects.XNodeSet Cause: java.lang.ClassCastException: org.apache.xpath.objects.XRTreeFrag cannot be cast to org.apache.xpath.objects.XNodeSet 
[xslt] Failed to process D:\workDirs\PLMXML2HeirarchalXML\target\step1.xml 

BUILD FAILED 
D:\workDirs\PLMXML2HeirarchalXML\build.xml:5: Fatal error during transformation 

И все методы, которые я нашел и пытался заставить ANT использовать Saxon (т. е добавление Saxon в CLASSPATH, XSLT/завод), кажется, приводит к Saxon называют, а не Xalan, но теперь я получаю следующее сообщение об ошибке:

java.lang.NullPointerException 
at org.apache.xerces.parsers.AbstractSAXParser.setContentHandler(Unknown Source) 
      at net.sf.saxon.Configuration.reuseStyleParser(Configuration.java:2346) 
      at net.sf.saxon.PreparedStylesheet.loadStylesheetModule(PreparedStylesheet.java:261) 
      at net.sf.saxon.PreparedStylesheet.prepare(PreparedStylesheet.java:185) 
      at net.sf.saxon.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:132) 
      at org.apache.tools.ant.taskdefs.optional.TraXLiaison.readTemplates(TraXLiaison.java:300) 
      at org.apache.tools.ant.taskdefs.optional.TraXLiaison.createTransformer(TraXLiaison.java:317) 
      at org.apache.tools.ant.taskdefs.optional.TraXLiaison.transform(TraXLiaison.java:178) 
      at org.apache.tools.ant.taskdefs.XSLTProcess.process(XSLTProcess.java:853) 
      at org.apache.tools.ant.taskdefs.XSLTProcess.execute(XSLTProcess.java:389) 
      at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
      at java.lang.reflect.Method.invoke(Method.java:597) 
      at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
      at org.apache.tools.ant.Task.perform(Task.java:348) 
      at org.apache.tools.ant.Target.execute(Target.java:392) 
      at org.apache.tools.ant.Target.performTasks(Target.java:413) 
      at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) 
      at org.apache.tools.ant.Project.executeTarget(Project.java:1368) 
      at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
      at org.apache.tools.ant.Project.executeTargets(Project.java:1251) 
      at org.apache.tools.ant.Main.runBuild(Main.java:811) 
      at org.apache.tools.ant.Main.startAnt(Main.java:217) 
      at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) 
      at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) 

Так что, если я позволю Xalan сделать обработку, задача растеризатора все еще работает, но мой ранее работающий XSLT этого не делает, и если я использую Saxon no вещь работает. Я попытался установить ANT 1.8.4, но получаю те же результаты.

Я исчерпал все ресурсы, которые я нашел, включая похожие сообщения на этом сайте, но все решения, похоже, указывают на то, что я уже пробовал.

Надеюсь, этого достаточно, чтобы кто-то дал мне несколько советов или помощи.

Спасибо, Keith

+0

Наконец-то получил! Во-первых, я удалил записи CLASSPATH для растеризатора, которые снова заработали Saxon. (Я не эксперт в этих областях, поэтому я не могу объяснить, почему.) Но теперь я вернулся к квадрату с растеризантаской.Через пробную версию и ошибку я получил ее для работы, добавив скомпилированные банки в файл ant/lib (обязательно изменив имя taskdef/classpath/pathelement/@ в моем скрипте ant) ​​и добавив classname = "org.apache.xalan.processor .TransformerFactoryImpl "в задачу растеризации. Спасибо Майклу Кей за то, что он помог мне выйти из колеи. – kcstrong

ответ

0

Там долгая история здесь различных проблем в различных Ant-релизах. (В результате у меня для одного есть много устаревшего кода Ant, использующего вызов Saxon через интерфейс командной строки.) Но я считаю, что с недавними релизами Ant, механизм фабрики trax работает правильно. Вы используете

<xslt...> 
    <factory name="net.sf.saxon.TransformerFactoryImpl"/> 
</xslt> 

?

Попытка контролировать, какой XSLT-процессор используется через путь к классам, по своей сути является неприемлемым. Это применимо к любому приложению, а не только к Ant. И я думаю, что все еще есть ошибки в способе, которым Ant манипулирует classpath - или, во всяком случае, быть более вежливым, поведением, которое не очевидно из документации.

+0

Спасибо, Майкл, ваш ответ заставил меня начать по правильному пути, и в итоге у меня все получилось. – kcstrong

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