2013-11-27 32 views
5

我想在XSLT中检查HTML文件是否存在。 我该怎么做? 我已经尝试从这里https://gist.github.com/emth/4531924的文件exists.xsl但它不适合我。我一直试图让它运行2个多小时,但我被卡住了。 这里是我的蚂蚁片断:如何在XSLT中检查文件是否存在?

<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> 
.... 

与蚂蚁,我会收到以下错误运行此:

[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 

灿有人提供我一个运行的例子,或者有其他的选择吗?谢谢!

+0

我觉得库文件exists.xsl使用XSL ENGIN 2.0,但你在1.0版本上运行它http://stackoverflow.com/questions/2917655/how-do-i-check-for-the-existence-of-an-external-file-with-xsl – Sawyer

+0

无论我使用的版本是1.0还是2.0 。我得到与2.0 – user1613270

回答

5

我已经找到了解决办法:

<xsl:when test="fs:exists(fs:new('myfile.html'))" xmlns:fs="java.io.File"> 
    <!-- do something here... --> 
</xsl:when> 

,它独立工作XSLT 1.0或2.0

+0

非常好的提示。只有标准的Java API。 –

+0

不幸的是,直接的Java调用不适用于Saxon 9 HE。 – Hraban

3

如果该文件是文本文件,你可以使用XSLT 2.0功能:

fn:func-unparsed-text-available()

的FN:未解析文本可用的功能决定是否在FN呼叫:未解析文本功能使用相同的参数会返回一个字符串。该函数将尝试读取由URI标识的资源,并检查它是否正确编码并且不包含无效字符。

这与fn:doc-available()类似,它改为处理XML文档。

+0

相同的错误它实际上是一个HTML文档,我需要检查是否存在 – user1613270

+0

是的。那可行。所以使用'fn:func-unparsed-text-available()'。 –

+0

不幸的是,它不适合我吗?我收到错误:错误!错误检查表达式'funcall的类型(func-unparsed-text-available,[literal-expr(myfile.html)])''。 致命错误!无法编译样式表 – user1613270