如何修改Java XSL Transformer类的错误消息区域设置
问题背景
在Java 8环境中使用默认Xalan实现的Transformer类时,因系统区域设置为法语,XSL转换的错误/警告消息会输出为法语(如示例中的"Avertissements de compilateur"、"Erreur de syntaxe")。尝试通过transformer.setParameter("http://apache.org/xml/properties/locale", Locale.ENGLISH)无效,该属性仅适用于SAXParser,而非Transformer。
可行解决方案
方法1:临时修改当前线程的默认Locale
Xalan的错误消息资源(org.apache.xalan.res.XSLMessages)会读取当前线程的默认Locale生成本地化消息,因此可以在Transformer创建和执行阶段临时切换Locale,执行完成后恢复原设置:
// 保存原Locale Locale originalLocale = Locale.getDefault(); try { // 切换为英语Locale Locale.setDefault(Locale.ENGLISH); // 创建TransformerFactory、Transformer并执行转换 TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(new StreamSource("your.xsl")); transformer.transform(new StreamSource("input.xml"), new StreamResult("output.xml")); } finally { // 恢复原Locale Locale.setDefault(originalLocale); }
注意:该方式会影响当前线程中所有依赖Locale的操作,单线程环境下安全;多线程环境中需确保线程隔离,避免干扰其他逻辑。
方法2:通过系统启动参数强制设置英语Locale
如果允许修改Java程序的启动参数,可以添加以下参数,全局将程序默认Locale设为英语:
-Duser.language=en -Duser.country=US
这种方式无需修改代码,适合所有依赖Locale的组件统一输出英语消息,但会影响整个程序的本地化行为。
为什么setParameter无效?
http://apache.org/xml/properties/locale是Apache SAXParser的专属配置属性,仅对XMLReader生效。Transformer类并不识别该参数,因此调用transformer.setParameter()传递该属性不会改变Xalan的消息Locale。
内容的提问来源于stack exchange,提问作者Hervé Girod

