查看Saxon 文档,命令行上有一个“-x:className”标志,用于指定在 XSLT 应用期间使用的特定 SAX 解析器。
如何以编程方式实现这一目标?我现在在我的代码中使用 s9api,我检查了Processor
、XsltCompiler
、XsltExecutable
和XsltTransformer
对象;他们都没有办法设置 SAX 解析器。我还实例化了 a net.sf.saxon.Transform
,它也没有任何东西。
我很可能正在查看错误的对象集,但我不知道我应该如何知道正确的对象集是什么。
链接到上面提到的命令行文档“对源文件和使用 document() 函数加载的任何文件使用指定的 SAX 解析器”。我敢肯定,如果我知道自己在做什么,那么提到“ document()
”函数会立即提示我。不幸的是,我不知道,而且事实并非如此。
编辑: Michael Kay 下面的答案是正确的。(当然是!他是撒克逊人!)我想我会为后代添加一些示例代码。
首先,他的解决方案使用net.sf.saxon.s9api.Processor
:
Processor processor = new Processor(false);
processor.setConfigurationProperty(FeatureKeys.SOURCE_PARSER_CLASS,
"fully.qualified.package.name.of.MySAXParser");
在上面,将 SAXParser 的完全限定名(而不仅仅是类名)作为 String提供给它很重要。如果您执行以下操作:
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 的实现中搞砸了。
2.) 如果我想转换非 XML 文档(是的,这完全有可能)我不能使用解决方案 #2,因为调用 XsltTransform.setSource() 会导致它默认将源作为 XML 文档查看,并且会给你可怕的
Error on line 1 column 1
SXXP0003: Error reported by XML parser: Content is not allowed in prolog.
因此,为了转换非 XML 文档,您必须使用“粗粒度”处理器解决方案。