2012-06-27 9 views
6

Używam Xalana w mojej aplikacji, ale muszę użyć Saxona z referencyjną implementacją, aby wygenerować wynik testu, z którym można porównać. Chcę ich używać zarówno podczas testów jednostkowych. Jednakże, jak tylko mogę dodać zależność od Saxon w .pom projektu, wniosek wydaje się używać Saxon dla wszystkich operacji XSLT i XPath podczas testów:Używanie Xalana wraz z Saxonem

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

To sprawia, że ​​główny wniosek nie podczas generowania wyjście należytej do innego zachowania XPath. Podczas działania głównej aplikacji poza zakresem testowym działa.

Jak mogę uruchomić główną aplikację przy użyciu Xalan, ale testy przy użyciu Saxon, podczas testów?

Próbowałem ustawienie następującą właściwość przed uruchomieniem XALAN i saksońskiej części:

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

Próbowałem również umieścić części XALAN i Saxon w różnych projektach, a ja również starał się je zarówno do użytku z trzeciego projektu, z tym samym wynikiem.

Odpowiedz

10

Unikaj polegania na mechanizmie fabrycznym JAXP do wyboru silnika transformacji. Zamiast tego załaduj dokładnie silnik, który chcesz: jest o wiele bardziej niezawodny i znacznie szybszy. Saxon, wymienić połączenie

TransformerFactory.newInstance() 

z

new net.sf.saxon.TransformerFactoryImpl() 

i Xalan używać

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

To IT XPath część jednak zawodzi. Czy istnieje sposób na powiedzenie XPathFactory, aby używał domyślnej implementacji? Ta odpowiedź mówi, jak zrobić coś przeciwnego, skorzystaj z implementacji Saxona http://stackoverflow.com/questions/926222/using-saxon-xpath-engine-in-java. – Danik

+1

To byłby org.apache.xpath.jaxp.XPathFactoryImpl zgodnie z http://www.jarvana.com/jarvana/view/xalan/xalan/2.7.0/xalan-2.7.0.jar!/org/apache/ xpath/jaxp/XPathFactoryImpl.class? classDetails = ok. W każdym razie proponuję użyć mechanizmu JAXP do Twojej aplikacji, zamiast uzależniać ją od implementacji, chyba że masz wyjątkowe zastosowania w swojej aplikacji. W testach używaj tylko kodu zależnego od imp. –

+2

Nie zgadzam się. Wiele osób potknie się, ponieważ używają mechanizmu JAXP i przechwytują procesor XPath 2.0, gdy ich aplikacja wymaga procesora XPath 1.0. Nie można jawnie poprosić o procesor XPath 1.0; jeśli nie powiesz, czego chcesz, nie wiesz, co dostaniesz, i może nie działać. –

2

Oto rozwiązanie dla kompletności:

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); 
Powiązane problemy