2012-06-27 13 views
6

Utilizo Xalan en mi aplicación, pero necesito usar Saxon con una implementación de referencia para generar resultados de prueba para comparar. Quiero usarlos ambos durante las pruebas unitarias. Sin embargo, tan pronto como se agrego una dependencia de Saxon en el .pom proyecto, la aplicación parece utilizar sajona para todas las operaciones XSLT y XPath durante las pruebas:Usando Xalan junto a Saxon

<dependency> 
    <groupId>net.sf.saxon</groupId> 
    <artifactId>Saxon-HE</artifactId> 
    <version>9.4</version> 
    <scope>test</scope> 
</dependency> 

Esto hace que la aplicación principal falle al generar salida debido a un comportamiento XPath diferente. Cuando se ejecuta la aplicación principal fuera del alcance de la prueba, funciona.

¿Cómo puedo ejecutar la aplicación principal usando Xalan, pero las pruebas con Saxon, durante las pruebas?

He intentado fijar la siguiente propiedad antes de ejecutar los Xalan y sajones partes:

System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl "); 
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl"); 

También he tratado de poner las piezas Xalan y sajones en diferentes proyectos, y también he tratado de utilizar los dos de un tercer proyecto, con el mismo resultado.

Respuesta

10

Evite confiar en el mecanismo de fábrica de JAXP para seleccionar su motor de transformación. En su lugar, cargue el motor que desea explícitamente: es mucho más confiable y mucho más rápido. Para Saxon, reemplace la llamada en

TransformerFactory.newInstance() 

con

new net.sf.saxon.TransformerFactoryImpl() 

y para Xalan usar

new org.apache.xalan.processor.TransformerFactoryImpl() 
+0

Se convierte en el XPath parte que está fallando sin embargo. ¿Hay alguna manera de decirle a XPathFactory que use la implementación predeterminada? Esta respuesta dice cómo hacer lo contrario, use la implementación de Saxon http://stackoverflow.com/questions/926222/using-saxon-xpath-engine-in-java. – Danik

+1

Eso sería org.apache.xpath.jaxp.XPathFactoryImpl según http://www.jarvana.com/jarvana/view/xalan/xalan/2.7.0/xalan-2.7.0.jar!/org/apache/ xpath/jaxp/XPathFactoryImpl.class? classDetails = ok. De todos modos, sugiero utilizar el mecanismo JAXP para su aplicación en lugar de hacerlo dependiente de la implementación a menos que tenga casos extremos de uso en su aplicación. Solo use el código impl dependiente en las pruebas. –

+2

No estoy de acuerdo. Mucha gente se tropieza porque usa el mecanismo JAXP y elige un procesador XPath 2.0 cuando su aplicación requiere un procesador XPath 1.0. No puede pedir explícitamente un procesador XPath 1.0; si no dice lo que quiere, no sabe lo que obtendrá y puede que no funcione. –

2

Aquí está la solución para la integridad:

System.setProperty(XPathFactory.DEFAULT_PROPERTY_NAME + ":" 
    + XPathFactory.DEFAULT_OBJECT_MODEL_URI, 
    "org.apache.xpath.jaxp.XPathFactoryImpl"); 
System.setProperty(XPathFactory.DEFAULT_PROPERTY_NAME + ":" 
    + NamespaceConstant.OBJECT_MODEL_SAXON, 
    "net.sf.saxon.xpath.XPathFactoryImpl"); 

XPathFactory jaxpFactory = 
    XPathFactory.newInstance(XPathFactory.DEFAULT_OBJECT_MODEL_URI); 
XPathFactory saxonFactory = 
    XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); 
Cuestiones relacionadas