我有一个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)运行时工作正常,但它在构建后抛出该错误。我检查了什么:
fileName
的文件路径正确, 文件存在。"file:/"
并置并再次:在IDE上工作,它在构建时不起作用。试图使用具有相同结果的.getCanonicalPath()
。答案 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中以及构建的应用程序中都在类路径中。