2012-07-03 89 views
4

查看the Saxon documentation在命令行上有一個「-x:className」標誌,用於指定在應用XSLT期間使用的特定SAX解析器。Java中的Saxon:指定SAX解析器

如何以編程方式實現此目的?我現在在我的代碼中使用了s9api,並且檢查了ProcessorXsltCompilerXsltExecutableXsltTransformer對象;他們都沒有辦法設置SAX解析器。我還實例化了一個net.sf.saxon.Transform,那也沒有任何東西。

我很可能看錯了一套對象,但我不知道我應該怎麼知道正確的設置是什麼。

鏈接到上面提到的命令行文檔「使用指定的SAX解析器作爲源文件和使用文檔()函數加載的所有文件」。我敢肯定,如果我知道自己在做什麼,那麼提及「document()」函數會立即引起我的注意。不幸的是,我沒有,事實並非如此。

編輯:邁克爾凱的答案是正確的。 (當然是!他是撒克遜人!)我想我會爲後代添加一些示例代碼。

首先,他的解決方案使用net.sf.saxon.s9api.Processor

Processor processor = new Processor(false); 
processor.setConfigurationProperty(FeatureKeys.SOURCE_PARSER_CLASS, 
    "fully.qualified.package.name.of.MySAXParser"); 

在上面的,它作爲一個字符串的SAXParser的的供應它的完全限定名(而不僅僅是類名)是很重要的。如果你做到以下幾點:

processor.setConfigurationProperty(FeatureKeys.SOURCE_PARSER_CLASS, 
    new MySAXParser()); 

...你會得到這樣的:

java.lang.IllegalArgumentException: SOURCE_PARSER_CLASS class must be a String 

二,用net.sf.saxon.s9api.XsltTransformer他的解決方案:

// ^^^ Various setup code to get to this point... 
XsltTransformer transformer = xsltExecutable.load(); 
File file = new File("/path/to/my/file"); 
InputStream fileInputStream = new FileInputStream(file); 
InputSource inputSource = new InputSource(fileInputStream); 
Source saxSource = new SAXSource(new MySAXParser(), inputSource); 
transformer.setSource(saxSource); 
// vvv Set other parameters, actually invoke the transform, etc... 

我唯一的問題/注意事項是:

1.)在控制檯中打印出以下消息:

Cannot find CatalogManager.properties 

這似乎沒有影響任何東西,因爲轉換仍然可以正常工作,而且我很確定它與撒克遜本身沒有任何關係,而是我在實現中搞亂了一些東西我的自定義SAXParser。如果我想轉換一個非XML文檔(是的,這是完全可能的),我不能使用解決方案#2,因爲調用XsltTransform.setSource()會導致它默認查看源代碼作爲XML文檔,並會給你可怕的

Error on line 1 column 1 
    SXXP0003: Error reported by XML parser: Content is not allowed in prolog. 

因此,把非XML文檔,您必須使用「粗粒度」的處理器解決方案。

回答

1

如果您想確保能夠獲得Saxon問題的答案,請在dev.saxonica.com上使用Saxon論壇或在SourceForge上使用撒克遜幫助列表。

答案是:你可以使用

Processor.setConfigurationProperty(
    FeatureKeys.SOURCE_PARSER_CLASS, parserClassName) 

然而,這可能有點粗粒:它工作在命令行上,因爲配置設置通常只轉換一個文件。爲了實現更好的控制,您可以始終以SAXSource對象的形式爲輸入提供輸入,SAXSource對象包含一個XMLReader,它代表您想要使用的SAX解析器的一個實例。