如何在XSLT中检查文件是否存在?

5
我想要在XSLT中检查HTML文件是否存在。
我该怎么做?
我已经尝试了这里的file-exists.xsl https://gist.github.com/emth/4531924,但对我来说没有用。我一直在尝试让它运行超过2个小时,但我卡住了。
这是我的ant片段:
<target name="transform">
    <xslt in="/tmp/sample.xml" out="/tmp/out.html" style="/tmp/sample.xsl" />
</target>

这是我的 XSLT 文件:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:java="http://www.java.com/">
<xsl:import href="file-exists.xsl"/>
...    
<xsl:if test="java:file-exists('myfile.html', base-uri())">
    <!-- do something here... -->
</xsl:if>
....

使用Ant运行时,我会收到以下错误信息:
[xslt] Processing /tmp/sample.xml to /tmp/out.html
[xslt] Loading stylesheet /tmp/sample.xsl
[xslt] : Error! The first argument to the non-static Java function 'fileExists' is not a valid object reference.
[xslt] : Error! Cannot convert data-type 'void' to 'boolean'.
[xslt] : Fatal Error! Could not compile stylesheet
[xslt] Failed to process /tmp/sample.xml

有没有人可以给我提供一个运行的例子,或者是否有其他的选择?谢谢!


我认为库文件 file-exists.xsl 使用了 XSL 引擎 2.0,但您在版本 1.0 中运行它。https://dev59.com/unE85IYBdhLWcg3wJQGt - Sawyer
无论我使用版本1.0还是2.0都没有关系,我在2.0中仍然遇到了相同的错误。 - user1613270
2个回答

6
我找到了一个解决方案:
<xsl:when test="fs:exists(fs:new('myfile.html'))" xmlns:fs="java.io.File">
    <!-- do something here... -->
</xsl:when>

它可以独立于XSLT 1.0或2.0工作。


非常好的提示。只使用标准的Java API。 - Emmanuel Devaux
不幸的是,直接的Java调用无法与Saxon 9 HE一起使用。 - Hraban

3
如果文件是文本文件,则可以使用XSLT 2.0函数:fn:func-unparsed-text-available()
fn:unparsed-text-available函数确定是否调用具有相同参数的fn:unparsed-text函数将返回一个字符串。该函数将尝试读取由URI标识的资源,并检查其是否正确编码并且不包含无效字符。
这类似于仅适用于XML文档的fn:doc-available()函数。

这实际上是一个HTML文档,我需要检查其是否存在。 - user1613270
没错,那会起作用。所以使用 fn:func-unparsed-text-available() - Sean B. Durkin
很不幸,它对我不起作用。我收到了错误信息:错误!检查表达式“funcall(func-unparsed-text-available,[literal-expr(myfile.html)])”的类型时出错。 致命错误!无法编译样式表。 - user1613270
如果您正在使用符合XSLT 2.0标准的处理器,它应该可以正常工作。这是一个标准函数。请展示您的样式表,并使用fn:func-unparsed-text-available()函数。另外,请问您使用的是哪个XSLT处理器? - Sean B. Durkin
使用 system-property('xsl:vendor')、system-property('xsl:vendor-url') 和 system-property('xsl:version') 来查询。 - Sean B. Durkin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接