ANT运行Saxon 11时unparsed-text()函数报non-StreamSource错误怎么办
问题根因
该报错由Ant内置<xslt>任务的TraX处理器逻辑与Saxon 11的解析器类型校验规则冲突导致:
- Ant的TraX执行器默认会向TransformerFactory注入全局自定义URIResolver,该解析器处理
unparsed-text()这类非XML资源请求时,返回的是SAXSource类型对象 - Saxon 11对
unparsed-text()的解析返回值有强校验:UnparsedTextURIResolver必须返回StreamSource类型输入源,不接受SAXSource,因此直接抛出如下致命错误:
Resolver for unparsed-text() returned non-StreamSource;
- 现有配置中注释掉的
unparsedTextURIResolverClass配置思路正确,但通过factory attribute设置的方式无法覆盖Ant提前注入的自定义解析器,因此不会生效。
涉及的运行环境基线:SaxonEE11-3J、Ant 1.10.3、OpenJDK 1.8.0.191 win64、Windows 10 Pro。
解决方案
两种方案任选其一即可解决问题:
方案1:修改现有Ant配置,禁用Ant自带URI解析接管
在<xslt>标签上增加useURIFromStylesheet="true"属性,禁止Ant接管URI解析流程,让Saxon使用自带的标准解析器处理所有资源请求,调整后可直接生效的完整配置如下:
<path id="xslt.saxonEE.classpath"> <fileset dir="D:/SaxonEE11-3J"> <include name="*.jar"/> </fileset> </path> <target name="target-test"> <xslt in="C:/input.xml" style="D:/test.xsl" out="C:/test.xml" force="true" processor="trax" useURIFromStylesheet="true"> <classpath refid="xslt.saxonEE.classpath"/> <factory name="com.saxonica.config.EnterpriseTransformerFactory"> <attribute name="http://saxon.sf.net/feature/ignoreSAXSourceParser" value="true"/> </factory> </xslt> </target>
该方案改动量最小,不需要额外编写自定义代码,适配绝大多数使用场景。
方案2:升级Ant版本至1.10.12及以上
Ant从1.10.12版本开始专门修复了与Saxon 11+版本的解析器兼容问题:内置URIResolver遇到unparsed-text()这类非XML资源请求时,会自动返回Saxon要求的StreamSource类型,不需要修改原有任务配置,替换Ant安装版本即可直接解决问题。
验证说明
配置调整完成后重新执行转换任务,unparsed-text()函数可正常读取目标文本资源,不会再出现类型不匹配报错,其余XSLT转换逻辑不受任何影响。
内容的提问来源于stack exchange,提问作者Evgeny Degtyarev
相关产品推荐
相关产品推荐

