“仅在构建Java 8系统之后检查funcall(doc,parameter-ref ...)时出错

时间:2017-10-03 17:02:07

标签: java xml xslt intellij-idea

我有一个Java 8系统,它执行一系列XSLT转换。它完美无缺。

但是,一旦我构建了系统,在其中一个转换过程中,我会得到错误代码:Error when checking funcall(doc, [parameter-ref(Param_1/reference)])

我的XSLT接收文件路径作为参数,我使用以下代码段准备它:

private LinkedList<String[]> getParamsList(String fileName, int max, String paramName,
                                           String lastPName, String lastPPath) {
    // Prepare the uri
    String uri = fileName.replace(File.separator, "/");

    // Create a list
    LinkedList<String[]> parameters = new LinkedList<>();

    // Add basic parameters
    for(int i=1; i<=max; i++) {
        // Create the element
        String[] param = {paramName + i, "file:/" + uri};
        parameters.add(param);
    }

    // Create the last one
    String[] lastParam = {lastPName,
            (new File(lastPPath)).getAbsolutePath().replace(File.separator, "/")
    };
    parameters.addLast(lastParam);

    // Return the list
    return parameters;
}

然后在转换期间使用它:

private void transform(String xslt, LinkedList<String[]> params, File startFile, File endFile)
        throws TransformerException {
    // Prepare the factory and source
    TransformerFactory factory = TransformerFactory.newInstance();
    Source xsltSource = new StreamSource(new File(xslt));

    // Prepare the transformation
    Transformer transformer = factory.newTransformer(xsltSource);
    for(String[] p: params) {
        transformer.setParameter(p[0], p[1]);
    }

    // Obtain the input file
    Source text = new StreamSource(startFile);
    transformer.transform(text, new StreamResult(endFile));
}

XSLT包含以下部分:

<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:param name="Param_1" select="''"/>
<xsl:param name="Param_2" select="''"/>
<xsl:param name="Param_3" select="''"/>
<xsl:param name="Param_4" select="''"/>
<xsl:param name="Param_5" select="''"/>
<xsl:param name="Param_6" select="''"/>
<xsl:param name="Param_7" select="''"/>
<xsl:param name="Param_8" select="''"/>

我发送的“文件路径”是.getAbsolutePath()返回。

但是,我不明白为什么这不起作用。它从IDE(IntelliJ)运行时工作正常,但它在构建后抛出该错误。我检查了什么:

  • 正确查找XSLT文件。
  • fileName的文件路径正确, 文件存在。
  • 以前的转换效果很好!
  • 尝试删除"file:/"并置并再次:在IDE上工作,它在构建时不起作用。试图使用具有相同结果的.getCanonicalPath()

1 个答案:

答案 0 :(得分:0)

正如我们在评论中的交换中发现的那样,当您尝试使用XSLT 2.0和XSLT / XPath 2.0 doc函数时出现错误消息,该函数需要像Saxon 9这样的XSLT 2.0处理器但不知何故在您的最终的应用程序设置Saxon 9不在类路径上,并且JRE中的内置XSLT 1.0处理器Xalan试图执行样式表并给出了错误消息,因为它不知道doc函数。

要解决此问题,您必须确保Saxon 9在IDE中以及构建的应用程序中都在类路径中。