Saxon deja de funcionar después de instalar batik-rasterizer

¿Alguien podría por favor ayudarme con el siguiente problema?

Ayer estaba tratando de agregar un proceso a mi secuencia de comandos ANT (Windows XP, ANT versión 1.8.2, en su mayoría XSLT 2.0, Saxon 9 simplemente agregado a mi ant/lib) mediante el cual convierte un directorio de SVG a PDF usando la tarea rasterizer de Batik. Inicialmente tuve muchos problemas para que ANT reconociera la tarea de rasterizador, pero después de reinstalar Batik desde la fuente y con la ayuda del siguiente enlace, pude hacer que funcionara.

https://mail-archives.apache.org/mod_mbox/xmlgraphics-batik-users/200605.mbox/%3C445B43B9.4010403@harcotechnology.com%3E

Aunque estas instrucciones no indicaban hacerlo, descubrí que necesitaba volver a compilar/reconstruir rasterizertask.jar.

Como nota al margen, ya había agregado la ruta a las clases batik-rasterizer.jar y rasterizertask a mi CLASSPATH como se recomienda en el sitio oficial de Batik.

Y listo, tenía la tarea rasterizadora funcionando. Por desgracia, todas mis tareas XSLT 2.0 que siguieron a la tarea rasterizer en mi script ANT dejaron de funcionar. Por lo que pude ver, algo que hice provocó que el procesador XSLT predeterminado se cambiara a Xalan-j. Y Xalan no es compatible con gran parte de mi XSLT.

Por ejemplo, este es el error que recibo de Xalan (sé por qué recibo este error, por eso uso 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

Y todos los métodos que encontré e intenté obligar a ANT a usar Saxon (es decir, agregar Saxon a CLASSPATH, xslt/factory) parecen dar como resultado que se llame a Saxon en lugar de a Xalan, pero ahora aparece el siguiente error:

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)

Entonces, si dejo que Xalan haga el procesamiento, la tarea del rasterizador aún funciona, pero mi XSLT que funcionaba anteriormente no lo hace, y si uso Saxon, nada funciona. Intenté instalar ANT 1.8.4, pero obtengo los mismos resultados.

He agotado todos los recursos que he encontrado, incluidas publicaciones similares en este sitio, pero todas las soluciones parecen apuntar a cosas que ya he probado.

Espero que esta información sea suficiente para que alguien me pueda dar algún consejo o ayuda.

Gracias keith

preguntado el 12 de junio de 12 a las 21:06

¡Finalmente lo tengo! Primero, eliminé las entradas de CLASSPATH para el rasterizador, lo que hizo que Saxon volviera a funcionar. (No soy un experto en estas áreas, así que no puedo explicar por qué). Pero ahora estaba de vuelta al punto de partida con la tarea de rasterización. A través de prueba y error, conseguí que funcionara agregando los archivos jar compilados a ant/lib (asegurándome de cambiar taskdef/classpath/pathelement/@location en mi script ant) ​​y agregando classname="org.apache.xalan.processor .TransformerFactoryImpl" a la tarea de rasterización. Gracias a Michael Kay por ayudarme a salir de la rutina. -

1 Respuestas

Aquí hay una larga historia de diferentes problemas en diferentes versiones de Ant. (Como resultado, tengo una gran cantidad de código Ant heredado que se utiliza para llamar a Saxon a través de la interfaz de línea de comandos). Pero creo que con los lanzamientos recientes de Ant, el mecanismo de fábrica de trax funciona correctamente. Estas usando

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

?

Tratar de controlar qué procesador XSLT se usa a través de classpath es intrínsecamente propenso a fallas. Eso se aplica a cualquier aplicación, no solo a Ant. Y creo que todavía hay errores en la forma en que Ant manipula el classpath, o en cualquier caso, para ser más educados, comportamientos que no son evidentes en la documentación.

Respondido el 14 de junio de 12 a las 09:06

Gracias Michael, tu respuesta me ayudó a comenzar por el camino correcto y finalmente logré que todo funcionara. - kcfuerte

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.