You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:27:24