在Saxon 9 HE的XSLT中能否执行JavaScript检测文件存在?
在Saxon 9 HE里实现文件存在检测的可行方案
兄弟,先给你拍板核心结论:Saxon 9 HE确实不支持JavaScript扩展函数——这个能力是Saxon PE(专业版)和EE(企业版)才有的特性,HE作为免费开源版本没包含这个功能模块,所以你之前尝试的JS相关方法在HE里报错,完全是版本限制导致的,不是你操作错了。
那既然不能用JS,HE里怎么实现文件存在检测?最靠谱的方案是用Java扩展函数,毕竟Saxon本身就是Java写的,HE原生支持调用Java方法,步骤也不复杂:
第一步:写个简单的Java工具类
先编一个极简的Java类,提供静态方法专门用来检测文件是否存在:
import java.io.File; public class FileUtils { // 静态方法:传入文件路径,返回是否存在 public static boolean fileExists(String filePath) { File targetFile = new File(filePath); return targetFile.exists(); } }
把这个类编译成.class文件,或者打包成JAR包,放到Saxon能找到的类路径里——比如在Oxygen里,直接丢到它的lib目录就行,或者后面在设置里手动添加。
第二步:在XSLT里调用这个Java方法
在你的XSLT样式表里,先通过命名空间声明这个Java类,然后直接调用静态方法就行:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <!-- 这里要写Java类的全限定名,如果有包的话要加上,比如java:com.yourteam.utils.FileUtils --> xmlns:fileutils="java:FileUtils" exclude-result-prefixes="fileutils"> <!-- 举个调用例子 --> <xsl:template match="/"> <xsl:variable name="targetPath" select="'D:/test/my-file.xml'" /> <xsl:choose> <xsl:when test="fileutils:fileExists($targetPath)"> <status>目标文件已找到</status> </xsl:when> <xsl:otherwise> <status>目标文件不存在</status> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
几个要注意的细节
- 如果你的Java类是在某个包下的,命名空间要写全限定名,比如
java:com.yourcompany.tools.FileUtils,不能只写类名。 - 在Oxygen里用的话,得把编译好的
.class或JAR添加到Oxygen的类路径:打开Options > Preferences > XML > XSLT-FO-XQuery > Saxon > Classpath,点击添加按钮把文件加进去就行。 - 如果是命令行跑Saxon HE,要通过
-cp参数指定类路径,比如:java -cp saxon9he.jar;your-fileutils.jar net.sf.saxon.Transform -s:input.xml -xsl:your-stylesheet.xsl -o:output.xml
要是你不想折腾Java代码,还有个凑合用的小技巧:利用XSLT的doc()函数+try/catch间接判断。原理是如果文件不存在,doc()会抛出错误,我们捕获这个错误就知道文件不存在了:
<xsl:function name="local:fileExists" as="xs:boolean"> <xsl:param name="filePath" as="xs:string"/> <xsl:try> <!-- 尝试加载文件,能加载就说明存在 --> <xsl:sequence select="doc($filePath) castable as node()"/> <xsl:catch> <!-- 捕获到错误就返回false --> <xsl:sequence select="false()"/> </xsl:catch> </xsl:try> </xsl:function>
不过这个方法有局限性:比如文件存在但不是XML/文本文件,或者你没有读取权限,也会返回false,适合简单场景,追求精准的话还是Java方法靠谱。
内容的提问来源于stack exchange,提问作者Ole
相关产品推荐
相关产品推荐

