2015-04-04 162 views
1

我正在使用JAXP XSLT API(javax.xml.transform)來轉換xml文件。什麼是默認的TransformerFactory?

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(xslSource); 
transformer.transform(inputSource, outputResult); 

的TransformerFactory中的Javadoc說: 它使用以下查找過程順序來確定的TransformerFactory實現類加載:

  1. 使用javax.xml.transform.TransformerFactory的系統屬性。
  2. 在JRE目錄中使用屬性文件「lib/jaxp.properties」。 配置文件採用標準java.util.Properties格式, 包含實現類的完全限定名稱,其中 的關鍵是上面定義的系統屬性。 JAXP.properties 文件僅由JAXP實現讀取一次,然後將其值 緩存以供將來使用。如果 第一次嘗試讀取文件時該文件不存在,則不會再嘗試 以檢查其存在。在第一次讀取 之後,無法更改jaxp.properties中任何屬性的值 。
  3. 使用Services API(詳見JAR 規範)(如果可用)確定類名。服務API將在運行時可用的罐子 中的文件 META-INF/services/javax.xml.transform.TransformerFactory中尋找類名。
  4. 平臺默認TransformerFactory實例。

我不知道如何決定哪個是默認的TransformerFactory實例?

回答

2

這裏的「Platform」對於您正在使用的Java編譯器/運行庫來說是Java語言。所以「平臺默認」意味着任何JDK決定。就Oracle JDK而言,它是JDK內置的Xalan XSLT 1.0引擎的一個版本。不同的JDK可以使用不同的默認值。

+0

謝謝。如何檢查Oracle JDK附帶的默認xslt處理器支持哪些XSLT版本(1.0,2.0,3.0),例如Oracle JDK 1.6? – user3014901 2015-04-05 17:51:29

+0

所有當前版本Oracle JDK中的默認XSLT處理器僅支持XSLT 1.0。但是如果你想檢查這個,你可以寫一個測試,例如'test =「system-property('xsl:version')= 1.0」' – 2015-04-05 22:45:24

1

從甲骨文JDK 1.7

javax.xml.transform.TransformerFactory

默認變壓器是XSLTC(最初從Xalan的分叉)。 XSLTC是編譯版本( 'C' 在XSLTC) com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

public static TransformerFactory newInstance() 
    throws TransformerFactoryConfigurationError { 
    try { 
     return (TransformerFactory) FactoryFinder.find(
     /* The default property name according to the JAXP spec */ 
     "javax.xml.transform.TransformerFactory", 
     /* The fallback implementation class name, XSLTC */ 
     "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"); 
    } catch (FactoryFinder.ConfigurationError e) { 
     throw new TransformerFactoryConfigurationError(
      e.getException(), 
      e.getMessage()); 
    } 
}