2010-06-03 34 views
20

在我的Web應用程序中,我需要使用Saxon TransformerFactory才能使用XSLT 2.0,但我無法使用setProperty方法,因爲我沒有這個權限在Web服務器上,並且存在安全經理。如何在Java中選擇撒克遜TransformerFactory

所以我已閱讀,它應該是可能做到這一點:

如果Services API(在JAR規範中詳述),如果有的話,來確定類名稱。 Services API將在運行時可用的jar文件中的META-INF/services/javax.xml.transform.TransformerFactory文件中查找類名。

我在WEB-INF/lib/saxon9.jar中找到了這個文件,但是當我拼出一個TransformerFactory的時候,總是選擇默認的工廠而不是撒克遜工廠。

如何選擇薩克森變壓器工廠?

感謝

+0

以下(和更多)的所有方法的總結可以在這裏找到:http://stackoverflow.com/questions/11314604/how-to-set-saxon-as-the-xslt-processor-in-java – 2012-07-07 23:00:22

回答

11

你可以嘗試像

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

設置的系統屬性中的代碼中獲得的TransformerFactory實例之前做到這一點。

注意:這將強制Tomcat上的所有webapps使用saxon - 因此您必須確保使用默認值的任何其他webapps都可以。

5

如果您的應用程序確實需要撒克遜人,不會與其他處理器工作,那麼它很可能是罰款,直接實例使用new net.sf.saxon.TransformerFactoryImpl()

22

的正確方法通過指定工廠類要做到這一點是獲得當撒克遜的TransformerFactory一個新的TransformerFactory。我不認爲調用特定的工廠實現將工作 - 我相信默認的系統變換器可能仍然會返回(至少這是當我在類路徑中有xalan和撒克遜時發生了什麼)。

例如:

TransformerFactory tFactory = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl",null); 

或撒克遜

TransformerFactory tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null); 

的Javadoc:

獲得一個 的TransformerFactory從工廠類 名稱的新實例。當 類路徑中存在多個提供程序時,此函數很有用。它可以更多地控制 應用程序,因爲它可以指定 應該加載哪個提供程序。一旦 應用程序已獲得 參考TransformerFactory它可以使用工廠配置和 獲得變壓器實例。

+1

這適用於Java v6(http://docs.oracle.com/javase/6/docs/api/javax/xml/transform/TransformerFactory.html vs http://docs.oracle.com/javase/1.5.0 /docs/api/javax/xml/transform/TransformerFactory.html) – 2012-02-13 21:36:36

+1

這不適用於Oracle融合中間件11.1.1.5.0版本,因爲它在其客戶機jar文件中使用較早的實現。 – sweetfa 2012-04-24 05:47:22

8

創建文件META-INF/services/javax.xml.transform.TransformerFactory,內容:net.sf.saxon.TransformerFactoryImpl。而已。

+0

這不適合我。我使用了我的webapp的主要META-INF目錄。我需要使用不同的嗎? – Carsten 2015-05-12 02:11:32

+0

我想通了。它必須以WEB-INF/classes/META-INF/...結尾 – Carsten 2015-05-12 03:36:23