使用XSLT合并XML文件时部分文件触发模板规则内部求值错误
解决XSLT合并XML时Oracle解析器的NullPointerException(命名空间解析错误)
先看关键的错误堆栈信息:
java.lang.RuntimeException: Internal error evaluating template rule at line 8 in module file:/opt/Liferay-Bundle/tomcat-7.0.42/temp/temp128140163092620110910826941/OneShot/ParaNumber/RawMap.xslt ... Caused by: java.lang.NullPointerException at oracle.xml.parser.v2.NonValidatingParser.resolveNS(NonValidatingParser.java:1803) at oracle.xml.parser.v2.NonValidatingParser.expandNamespace(NonValidatingParser.java:1754)
从堆栈能直接定位问题:Saxon在处理Story_u4ac.xml时,调用Oracle的XML解析器做命名空间解析,结果抛出了空指针异常。我之前处理过类似的问题,给你几个排查和解决的方向:
先检查出错的XML文件命名空间
打开Story_u4ac.xml,重点扫一遍所有命名空间相关的代码:- 有没有用了没声明的前缀?比如写了
<custom:content>但没加xmlns:custom="http://your-namespace.com"的声明 - 有没有无效的命名空间属性?比如
xmlns:(没写前缀名)、xmlns:test=""(空URI)这种不符合XML规范的写法 - 命名空间的引号有没有漏闭合?比如
xmlns:foo=http://example.com这种低级语法错误
- 有没有用了没声明的前缀?比如写了
强制Saxon用自带的解析器
看起来你的环境里Saxon默认调用了Oracle的解析器,二者可能存在兼容性冲突。你可以在代码里强制Saxon使用它自己的解析器,绕过Oracle的实现:// 初始化Saxon的TransformerFactory TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl(); // 获取Saxon配置并设置默认XML解析器 net.sf.saxon.Configuration config = (net.sf.saxon.Configuration) factory.getAttribute("http://saxon.sf.net/feature/configuration"); config.setXMLParserClassName("net.sf.saxon.lib.StandardXMLParser");验证XML文件的完整性
用xmllint这类工具检查Story_u4ac.xml的语法是否合规:xmllint Story_u4ac.xml如果工具报出语法错误,跟着提示修复就行,很多时候空指针都是因为XML本身格式损坏导致的。
检查XSLT里的document()函数调用
错误是在执行document()加载XML时触发的,你可以确认一下:Story_u4ac.xml是不是真的存在于临时目录里?有没有权限读取?- 文件编码是不是和XSLT预期的一致?比如XML是GBK编码,但解析器默认用UTF-8,可能会导致解析异常
内容的提问来源于stack exchange,提问作者hari prasath
相关产品推荐
相关产品推荐

