我正在尝试在 Saxon XSLT 中调用 Java 方法。 我可以成功调用 File.renameTo() 等方法,但 Files.copy() 由于枚举而失败。
这是 XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:files="java:java.nio.file.Files" xmlns:path="java:java.nio.file.Path" xmlns:copyopt="java:java.nio.file.StandardCopyOption" exclude-result-prefixes="files path copyopt" version="3.0" expand-text="yes">
<xsl:template match="/">
<xsl:if test="files:copy(path:of(xs:anyURI('file:///from.txt')),path:of(xs:anyURI('file:///to.txt')),copyopt:REPLACE_EXISTING)"/>
</xsl:template>
</xsl:stylesheet>
错误是:
有多个方法与函数调用 Q{java:java.nio.file.Files}copy#3 匹配,并且没有足够的类型信息来确定应该使用哪一个
关于如何正确键入枚举 REPLACE_EXISTING 有什么建议吗?
可能是
varargs
参数让 Saxon 无法使用或者需要特殊编码,我已经使用单个/普通参数选项创建了一个辅助类,例如
package org.example;
import java.io.IOException;
import java.nio.file.CopyOption;
import java.nio.file.Path;
import java.nio.file.Files;
public class FilesHelper {
public static void copy(Path src, Path dest, CopyOption copyOption1) throws IOException {
Files.copy(src, dest, copyOption1);
}
}
那么如果我声明例如
xmlns:filesHelper="java:org.example.FilesHelper"
并使用 filesHelper:copy(path:of(xs:anyURI('file:///from.txt')),path:of(xs:anyURI('file:///to.txt')),copyopt:REPLACE_EXISTING())
Saxon EE(使用 12.5 进行测试)使用 helper 方法毫无问题地运行该代码(当然,在类路径上使用已编译的 helper 类)。