java - Saxon 9、Java、来自 doc-available 的 NullPointer

标签 java saxon

这是修复 Saxon 9 HE, Java - Static errors, XTSE0210, XTSE0165, XPST0017 中的问题后出现的错误

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

  public static Document transformAsDocument(Document inputDoc, String xslDoc, Map<String,
      Object> params, String xslContextPath, String fullXsltFilePath) throws XmlException {

    try {
      System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
      TransformerFactory factory = TransformerFactory.newInstance();
      factory.setURIResolver(new ClasspathResourceURIResolver(xslContextPath));
      factory.setAttribute(FeatureKeys.GENERATE_BYTE_CODE, false);
      String systemId = XMLUtils.class.getResource(fullXsltFilePath).toString();
      Templates template = factory.newTemplates(new StreamSource(new StringReader(xslDoc), systemId));

      Transformer xformer = template.newTransformer();

      if (params != null) {
        for (Map.Entry<String, Object> entry : params.entrySet()) {
          xformer.setParameter(entry.getKey(), entry.getValue());
        }
      }

      DOMResult result = new DOMResult();

      DOMSource domSource = new DOMSource(inputDoc);


      xformer.transform(domSource, result);

      return (Document) result.getNode();

    } catch (TransformerConfigurationException e) {
      throw new XmlException(e);

    } catch (TransformerException e) {
      SourceLocator locator = e.getLocator();
      if (locator != null) {
        Map<String, Object> message = new HashMap<String, Object>();
        message.put("col", locator.getColumnNumber());
        message.put("line", locator.getLineNumber());
        message.put("publicId", locator.getPublicId());
        message.put("systemId", locator.getSystemId());
        throw new XmlException(message.toString(), e);
      }
      throw new XmlException(e);

    } catch (Exception e) {
      throw new 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 链中。

<xsl:variable name="paramsDoc" select="if (doc-available('input:request')) then doc('input:request') else ()"/>

相同的 XSLT 在命令行中工作,如 Saxon 9 HE, Java - Static errors, XTSE0210, XTSE0165, XPST0017 所示。

最佳答案

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

if (source instanceof StreamSource && 
    ((StreamSource)source).getInputStream() == null &&
    ((StreamSource)source).getReader() == null) {

Saxon 然后尝试使用标准 URI 解析器从该 Source 对象解析 URI:

String uri = source.getSystemId();
resolver = context.getController().getStandardURIResolver();
try {
     source = resolver.resolve(uri, "");

这会崩溃,因为 uri 为空。

Saxon 假设当用户提供的 URIResolver 返回 StreamSource 时,StreamSource 将包含 InputStream ReaderSystemID,但似乎它不包含这些。 Saxon 应该很好地报告这一点而不是崩溃,但它无法使用这样的 Source 对象做任何有用的事情。

关于java - Saxon 9、Java、来自 doc-available 的 NullPointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60675550/

相关文章:

java - 撒克逊 + Spring - IllegalArgumentException : Unknown Attribute http://java. sun.com/xml/jaxp/properties/schemaLanguage

java - 在 Java 1.4.2 中使用 Saxon-B(版本 9.1.0.8)需要帮助

java - 使用 json-to-xml() 函数进行 json 到 xml 转换会产生不良格式的输出

java - Jersey 客户端不等待 GET 方法的结果

java - 如何在 IntelliJ 中导入 Gradle 项目?

java - Intellij IDEA,格式化一个项目中的所有代码

java - 在自定义 XPath 函数中获取 XML 数据

c# - 如何在 .Net 上使用 Saxon 计算 Xpath 表达式

Java NIO 存储路径列表

java - 按顺序计算字符出现的次数