Saxon 9,Java,文档中的空指针可用

Saxon 9,Java,文档中的空指针可用,java,saxon,Java,Saxon,这是在中修复问题后出现的错误 从以下java代码调用XSLT转换时 public static Document transformAsDocument(Document inputDoc、String xslDoc、Map params、String xslContextPath、String fullXsltFilePath)抛出XmlException{ 试一试{ setProperty(“javax.xml.transform.TransformerFactory”、“net.sf.sa

这是在中修复问题后出现的错误

从以下java代码调用XSLT转换时

public static Document transformAsDocument(Document inputDoc、String xslDoc、Map params、String xslContextPath、String fullXsltFilePath)抛出XmlException{
试一试{
setProperty(“javax.xml.transform.TransformerFactory”、“net.sf.saxon.TransformerFactoryImpl”);
TransformerFactory=TransformerFactory.newInstance();
setURIResolver(新类路径资源解析程序(xslContextPath));
setAttribute(FeatureKeys.GENERATE_BYTE_CODE,false);
字符串systemId=XMLUtils.class.getResource(fullXsltFilePath.toString();
Templates Templates=factory.newTemplates(新的StreamSource(新的StringReader(xslDoc),systemId));
Transformer xformer=template.newTransformer();
如果(参数!=null){
对于(Map.Entry:params.entrySet()){
setParameter(entry.getKey(),entry.getValue());
}
}
DOMResult=新的DOMResult();
DOMSource DOMSource=新的DOMSource(inputDoc);
变换(domSource,result);
返回(文档)结果。getNode();
}捕获(TransformerConfiguration异常e){
抛出新的XmlException(e);
}捕获(转换异常e){
SourceLocator locator=e.getLocator();
如果(定位器!=null){
Map message=newhashmap();
message.put(“col”,locator.getColumnNumber());
message.put(“line”,locator.getLineNumber());
message.put(“publicId”,locator.getPublicId());
message.put(“systemId”,locator.getSystemId());
抛出新的XmlException(message.toString(),e);
}
抛出新的XmlException(e);
}捕获(例外e){
抛出新的XmlException(e);
}
}
我们看到下面的堆栈跟踪

java.lang.NullPointerException
    at net.sf.saxon.lib.StandardURIResolver.resolve(StandardURIResolver.java:153)
    at net.sf.saxon.functions.DocumentFn.resolveURI(DocumentFn.java:411)
    at net.sf.saxon.functions.DocumentFn.makeDoc(DocumentFn.java:283)
    at net.sf.saxon.functions.DocAvailable.docAvailable(DocAvailable.java:68)
    at net.sf.saxon.functions.DocAvailable.isDocAvailable(DocAvailable.java:31)
    at net.sf.saxon.functions.DocAvailable.call(DocAvailable.java:45)
    at net.sf.saxon.functions.DocAvailable.call(DocAvailable.java:21)
    at net.sf.saxon.expr.FunctionCall.iterate(FunctionCall.java:547)
    at net.sf.saxon.expr.Expression.effectiveBooleanValue(Expression.java:886)
    at net.sf.saxon.expr.instruct.Choose.choose(Choose.java:901)
    at net.sf.saxon.expr.instruct.Choose.iterate(Choose.java:952)
    at net.sf.saxon.expr.instruct.GlobalVariable.getSelectValue(GlobalVariable.java:643)
    at net.sf.saxon.expr.instruct.GlobalVariable.actuallyEvaluate(GlobalVariable.java:724)
    at net.sf.saxon.expr.instruct.GlobalVariable.evaluateVariable(GlobalVariable.java:692)
    at net.sf.saxon.expr.GlobalVariableReference.evaluateVariable(GlobalVariableReference.java:126)
    at net.sf.saxon.expr.VariableReference.evaluateItem(VariableReference.java:559)
    at net.sf.saxon.expr.SimpleStepExpression.iterate(SimpleStepExpression.java:113)
    at net.sf.saxon.expr.SlashExpression.iterate(SlashExpression.java:902)
    at net.sf.saxon.expr.Atomizer.iterate(Atomizer.java:321)
    at net.sf.saxon.expr.GeneralComparison.effectiveBooleanValue(GeneralComparison.java:685)
    at net.sf.saxon.expr.instruct.Choose.choose(Choose.java:901)
    at net.sf.saxon.expr.instruct.Choose.iterate(Choose.java:952)
    at net.sf.saxon.expr.instruct.GlobalVariable.getSelectValue(GlobalVariable.java:643)
    at net.sf.saxon.expr.instruct.GlobalVariable.actuallyEvaluate(GlobalVariable.java:724)
    at net.sf.saxon.expr.instruct.GlobalVariable.evaluateVariable(GlobalVariable.java:692)
    at net.sf.saxon.expr.GlobalVariableReference.evaluateVariable(GlobalVariableReference.java:126)
    at net.sf.saxon.expr.VariableReference.iterate(VariableReference.java:536)
    at net.sf.saxon.expr.instruct.ForEach.processLeavingTail(ForEach.java:434)
    at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:687)
    at net.sf.saxon.expr.instruct.TemplateRule.applyLeavingTail(TemplateRule.java:347)
    at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:505)
    at net.sf.saxon.Controller.transformDocument(Controller.java:2423)
    at net.sf.saxon.Controller.transform(Controller.java:1979)
    at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:596)
    at net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:73)


java.lang.AssertionError: Internal error: no value for variable $g_ndsTemplateDoc at line 118 of 
    at net.sf.saxon.expr.VariableReference.iterate(VariableReference.java:547) ~[Saxon-HE-9.8.0-15.jar:na]
    at net.sf.saxon.expr.instruct.ForEach.processLeavingTail(ForEach.java:434) ~[Saxon-HE-9.8.0-15.jar:na]
    at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:687) ~[Saxon-HE-9.8.0-15.jar:na]
    at net.sf.saxon.expr.instruct.TemplateRule.applyLeavingTail(TemplateRule.java:347) ~[Saxon-HE-9.8.0-15.jar:na]
    at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:505) ~[Saxon-HE-9.8.0-15.jar:na]
    at net.sf.saxon.Controller.transformDocument(Controller.java:2423) ~[Saxon-HE-9.8.0-15.jar:na]
    at net.sf.saxon.Controller.transform(Controller.java:1979) ~[Saxon-HE-9.8.0-15.jar:na]
    at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:596) ~[Saxon-HE-9.8.0-15.jar:na]
    at net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:73) ~[Saxon-HE-9.8.0-15.jar:na]

错误来自以下XSLT片段,它位于大型XSLT链中


同一XSLT在命令行中工作,如在

中,当请求解析URI时,
ClasspathResourceURIResolver
返回什么?它似乎返回了一个
source
对象,将Saxon带入代码路径

if (source instanceof StreamSource && 
    ((StreamSource)source).getInputStream() == null &&
    ((StreamSource)source).getReader() == null) {
然后,Saxon尝试使用标准URI解析器从此源对象解析URI:

String uri = source.getSystemId();
resolver = context.getController().getStandardURIResolver();
try {
     source = resolver.resolve(uri, "");
这个崩溃是因为
uri
为空


Saxon假设当用户提供的
URIResolver
返回
StreamSource
时,
StreamSource
将包含
InputStream
Reader
SystemID
,但它似乎不包含这些内容。Saxon可能会很好地报告这一点,而不是崩溃,但它无法对这样的
源对象做任何有用的事情。

我删除了
factory.setURIResolver(新的ClasspathResourceURIResolver(xslContextPath))现在就可以了。在针对Saxon 9.4的原始代码中,它需要这一行,因为没有传入
SystemId
。谢谢你的建议。