2009-05-28 15 views
6

Estoy tratando de ejecutar una transformación XSLT desde un archivo ant.¿Cómo ejecutar XSLT 2.0 con hormiga?

Estoy usando una hoja de estilos XSLT 2.0 con un analizador saxon 9 (es compatible con XSLT 2.0).

El problema es que parece que la hormiga siempre está llamando a un analizador XSLT 1.0.

Aquí está mi archivo de hormigas:

<xslt style="stylesheet.xslt" 
    basedir="core/"  
    extension=".xml" 
    destdir="core/" 
    classpath="D:\\DevTools\\saxon\\bin\\saxon9.jar"> 
</xslt> 

Si lo llamo directamente (sin hormigas), que está funcionando.

¿Alguna idea?

+0

Eso puede ser interesante http://www.xml.com/pub/a/2002/12/11/ant-xml.html pero un poco viejo (mtxslt última actualización es 2002 - http: //mtxslt.sf .net /) – paulgreg

Respuesta

17

El problema es que mientras Saxon se añade a la ruta de clases, el mecanismo de JAXP por defecto para determinar que se usa TransformerFactory y usará el predeterminado que es Xalan. O hay que hacer:

  • javax.xml.transform.TransformerFactory Ajuste variable de sistema a net.sf.saxon.TransformerFactoryImpl,
  • Añadir saxon9.jar a la variable CLASSPATH sistema o
  • Uso <factory name="net.sf.saxon.TransformerFactoryImpl"/> dentro del elemento xslt
3

Este tutorial parece dar instrucciones paso a paso sobre cómo hacer lo que están pidiendo:

http://www.abbeyworkshop.com/howto/xslt/ant-saxon/index.html

Desde que parece que está haciendo lo correcto. ¿Estás seguro de que necesitas las barras diagonales dobles?

Actualización: La documentación Ant XSLT menciona la propiedad 'fábrica' que puede ayudar a que se acerque:

http://ant.apache.org/manual/Tasks/style.html

+0

En Windows, creo que necesito. – paulgreg

+0

actualizado - posiblemente use el atributo 'fábrica'. – samjudson

1

EDIT:Dr. Michael Kay ha señalado que AntTransform ya no es compatible, ni recomendado.

Crear un taskdef de la sajona AntTransform class:

<taskdef name="saxon-xslt" classname="net.sf.saxon.ant.AntTransform" classpath="${basedir}/lib/saxon/saxon9.jar;${basedir}/lib/saxon/saxon9-ant.jar"/> 

    <saxon-xslt 
    in="${source.xml}" 
    out="${out.dir}/${output.xml}" 
    style="${basedir}/${stylesheet.xsl}" 
    force="true"> 
    </saxon-xslt> 


que han comenzado a utilizar la <xslt> tarea estándar con el frasco sajón especificado en un <classpath>, pero habían sido encontrándose con problemas de rendimiento. Pareció "colgarse" un poco cuando se llamó a la tarea. Descubrí que agregar processor="trax" y especificar <factory name="net.sf.saxon.TransformerFactoryImpl"/> lo ayuda a correr mucho más rápido.

<xslt in="${source.xml}" 
     out="${out.dir}/${output.xml}" 
     style="${basedir}/${stylesheet.xsl}" 
     processor="trax"> 
     <factory name="net.sf.saxon.TransformerFactoryImpl"/> 
     <classpath refid="saxon-classpath" /> 
</xslt> 
+0

Tenga en cuenta que la tarea AntTransform ya no se recomienda. Resultó ser un error, y no había una estrategia factible para probarlo adecuadamente, ya que Apache no lanzó un conjunto de pruebas exhaustivas para Ant. –

+0

observado. Empecé a usar la tarea estándar '' con el contenedor de saxon especificado en un '', pero me encontré con problemas de rendimiento. Pareció "colgarse" un poco cuando se llamó a la tarea. Recientemente, he encontrado que agregar 'processor =" trax "' y especificar '' lo ayuda a ejecutar mucho más rápido. –

6

Si tiene este problema, compruebe que no está utilizando 1.8.1 hormiga, porque hay una bug en 1.8.1 hormiga que impide que esto trabaja. (Aunque este no es el problema en la publicación original, porque eso fue antes de que se lanzara Ant 1.8.1).

Las opciones son:

  1. utiliza una versión de hormiga que no tiene el insecto (por ejemplo Ant 1.7.1).
  2. especificar explícitamente saxon9.jar en el CLASSPATH a Ant antes de que comience, ya sea:
    • establecer la variable de entorno del sistema CLASSPATH, o
    • Usar la opción de línea de comandos para -libant
  3. Definir su propia tarea usando SAXON Ant (como se describe en otra respuesta en este hilo).
  4. Solución añadiendo processor="org.apache.tools.ant.taskdefs.optional.TraXLiaison" como un atributo del elemento de tarea xslt.

lo haría sugerencia usando la opción 1, seguido de la opción 4.

Opción 2 va a funcionar, pero atribuye la responsabilidad de la persona que ejecuta la hormiga para configurar su entorno y ejecutar adecuadamente la hormiga. Supongo que no quiere eso, por lo que está tratando de obtener el atributo classpath en la tarea xslt para que funcione.

La opción 3 tiene limitaciones, porque SAXON Ant requiere descargar e instalar su archivo JAR. Además, SAXON Ant no funciona con SAXON 9.2 o posterior (y SAXON Ant no se ha actualizado desde su creación en junio de 2008).

En teoría, la especificación de un subelemento factory hace que el procesador XSLT que desea utilizar explícitamente - para evitar que el cargador de clases encuentre un procesador XSLT diferente anteriormente en su búsqueda, y usarlo en lugar de su procesador XSLT que está más allá abajo en CLASSPATH. En la práctica (al menos en ant 1.7.0, 1.7.1 y 1.8.0) si se especifica el subelemento factory, la tarea xslt ignora el atributo classpath, lo que significa que debe recurrir a la especificación explícita de CLASSPATH (opción 2). Por lo tanto, no ayuda a resolver el problema original. Sin embargo, esto parece haberse solucionado en el código fuente de Ant, por lo que podría funcionar en versiones posteriores a la 1.8.1.

+0

aquí está el enlace al error de la tarea ant 1.8.1 xslt: https://issues.apache.org/bugzilla/show_bug.cgi?id=49271 –

1

En lugar de esperar a que esto se solucione en la versión 1.8.2 y luego esperar a que todos puedan actualizarse a la versión 1.8.2, puede rodar su propia macro XSLT (para situaciones donde explícitamente desea usar Saxon, en lugar de usuario del motor XSLT seleccionado)

<macrodef name="xslt" uri="com.mycompany.mydepartment"> 
    <attribute name="in" /> 
    <attribute name="out" /> 
    <attribute name="style" /> 
    <attribute name="classpath" default="${saxon.jar.path}" /> 
    <attribute name="taskname" default="mydep:xslt" /> 
    <element name="params" optional="true" implicit="true" /> 
    <sequential> 
     <java classname="net.sf.saxon.Transform" 
       classpath="@{classpath}" 
       taskname="@{taskname}"> 
      <classpath path="${saxon.jar.path}" /> 
      <arg value="-s:@{in}" /> 
      <arg value="-xsl:@{style}" /> 
      <arg value="-o:@{out}" /> 
      <params /> 
     </java> 
    </sequential> 
</macrodef> 

puede invocarla como (suponiendo xmlns: mydep = "com.mycompany.mydepartment" está ajustado en el elemento del proyecto)

<mydep:xslt in="${myinput}" 
      out="${myoutput}" 
      style="${myxslt}"> 
    <arg value="param1=value1" /> 
    <arg value="param2=value2" /> 
    <arg value="+param3=somefile.xml" /> 
</mydep:xslt> 

usted puede encontrar los documentos para pasar los parámetros a Saxon al http://www.saxonica.com/documentation/using-xsl/commandline.xml

0

Al menos en la hormiga 1.8.0, la tarea xslt con un classpath especificado es muy lenta. El problema parece ser la carga de classpath. Ejecuté Ant en JDB y pasó todo el tiempo extra en org.apache.tools.ant.AntClassLoader.loadClass leyendo archivos zip.

yo probamos este antes de ejecutar la hormiga que se fue mucho más rápido:

hormiga -lib /path/to/saxon/saxon9.jar

El macrodef de Tom Howard funciona mejor, y aunque tiene una sintaxis impar para los parámetros XSLT, al menos es posible.

Cuestiones relacionadas