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

Saxonica PE 9.6.0.10遇无效XML字符报错仍返回0码,求无换许可证方案

问题

使用Saxon PE版本9.6.0.10的com.saxonica.ptree.StylesheetPackager生成分发用zip文件时,XML解析器会抛出SXXP0003错误(检测到如Unicode 0xf这类无效XML字符),但程序仍返回退出码0。失败时会生成一个无效的小型zip文件,不想通过判断文件大小来识别失败;该问题仅在Windows构建中出现,macOS下部分字符不会触发失败,且并非所有无效UTF-8字符都会触发异常(包括多字节无效字符)。现寻求无需更换许可证的解决方案。

可复现示例

test.xsl 文件内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:transform [
   <!ENTITY % entities SYSTEM "entities.dtd">
   %entities;
]>
<xsl:stylesheet version="2.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
   <xsl:template match=".*">
      <html lang="en">
         <body>
            kHello, world <!-- 此处包含Unicode 0xf字符 -->
         </body>
      </html>
   </xsl:template>
</xsl:stylesheet>

test.sh 脚本内容

java -classpath saxon9pe.jar com.saxonica.ptree.StylesheetPackager test.xsl test.zip
echo return code is $?

运行输出

Error on line 12 column 13 of test.xsl:
  SXXP0003: Error reported by XML parser: An invalid XML character (Unicode: 0xf) was found
  in the element content of the document.
net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException; systemId: file:/Users/jholt/test/test.xsl; lineNumber: 12; columnNumber: 13; An invalid XML character (Unicode: 0xf) was found in the element content of the document.
...
org.xml.sax.SAXParseException; systemId: file:/Users/jholt/test/test.xsl; lineNumber: 12; columnNumber: 13; An invalid XML character (Unicode: 0xf) was found in the element content of the document.
...
    at net.sf.saxon.Configuration.buildDocument(Configuration.java:3441)
    at com.saxonica.ptree.StylesheetPackager.archive(StylesheetPackager.java:65)
    at com.saxonica.ptree.StylesheetPackager.main(StylesheetPackager.java:152)
return code is 0

无需更换许可证的解决方案

1. 预校验XSL文件的XML有效性

在调用StylesheetPackager之前,先用Saxon自带的XML解析能力校验XSL文件的合法性。可以编写一个简单的Java工具类,核心逻辑是调用net.sf.saxon.Configuration.buildDocument()方法加载XSL文件,捕获SAXParseException异常,若出现则返回非0退出码,避免执行打包流程。

2. 封装调用脚本捕获错误输出

修改现有脚本,捕获StylesheetPackager的标准错误输出,检测是否包含"SXXP0003"或"invalid XML character"这类错误关键字。如果检测到错误:

  • 删除生成的无效zip文件
  • 返回非0退出码

示例修改后的bash脚本:

#!/bin/bash
java -classpath saxon9pe.jar com.saxonica.ptree.StylesheetPackager test.xsl test.zip 2>&1 | tee packager.log
if grep -q "SXXP0003\|invalid XML character" packager.log; then
    rm -f test.zip
    exit 1
fi
echo return code is $?

3. 预处理XSL文件过滤无效字符

对XSL文件进行预处理,移除或替换XML 1.0规范中不允许的字符(包括控制字符0x0-0x8、0xB-0xC、0xE-0x1F等)。可以用Python脚本批量处理,示例如下:

import re

def clean_invalid_xml_chars(text):
    # 移除XML 1.0禁止的控制字符
    return re.sub(r'[\x00-\x08\x0B\x0C\x0E-\x1F]', '', text)

with open('test.xsl', 'r', encoding='utf-8') as f:
    content = f.read()

cleaned_content = clean_invalid_xml_chars(content)

with open('test_cleaned.xsl', 'w', encoding='utf-8') as f:
    f.write(cleaned_content)

之后使用清理后的test_cleaned.xsl进行打包。

内容的提问来源于stack exchange,提问作者Jeff Holt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:53:11