如何以编程方式实现此目标?我现在正在我的代码中使用s9api,我检查了Processor,XsltCompiler,XsltExecutable和XsltTransformer对象;他们都没有办法设置SAX解析器.我还实例化了一个net.sf.saxon.Transform,它也没有任何东西.
我很可能正在查看错误的对象集,但我不知道我应该怎么知道正确的集合是什么.
命令行文档链接到上面提到的“为源文件使用指定的SAX解析器和使用document()函数加载的任何文件.”我敢肯定,如果我知道自己在做什么,那么提及“document()”函数会立刻引起我的注意.不幸的是,我没有,也没有.
编辑:迈克尔凯的答案是正确的. (当然是!他是撒克逊家伙!)我想我会为后代添加一些示例代码.
首先,他的解决方案使用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
这似乎没有任何影响,因为转换仍然可以正常工作,我很确定它与Saxon本身没有任何关系,而是我在自定义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文档,必须使用“粗粒度”处理器解决方案.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。