I\'ve found a lot of examples that reference Java and C for this, but how do I, or can I, check for the existence of an external file with XSL.
First, I realize that
If you still wants to do it in XSLT here is the solution, I have done it for myself as explained below.
This will not working with regular java.io.File class in XSLT. So I have used java.nio.file.Files class.
JARS required - servelt.jar w: is the namespace of the our own Java class where pathFromURI method is defined.
Code:
<xsl:variable name="fileURI" select="u:new($absoluteFilePath)" xmlns:u="java:java.net.URI"/>
<xsl:variable name="filePathFromURI" select="w:pathFromURI($fileURI)"/>
<xsl:variable name="fileNotExist" select="not(files:exists($filePathFromURI, /..)) or files:size($filePathFromURI) = 0"/>
public static java.nio.file.Path pathFromURI(java.net.URI uri) throws Exception {
return java.nio.file.Paths.get(uri);
}
Back to pgfearo's notice.
A proposed File Module EXPath specification would support file-system functions such as this (file:exists() in the spec) as standard XPath extension functions. There isn't yet an XSLT implementation for this, but its worth watching.
For those who need to check if an file exists or not.
file:exists($path as xs:string)
works fine now.
For anyone who needs plain XSLT solution for checking if file exist you can just use
unparsed-text-available(concat(system-property('user.dir'),'/filename.text'))
or wrap it into a function
<xsl:function name="functx:file-exists" xmlns:functx="http://www.functx.com">
<xsl:param name="path"/>
<xsl:value-of select="unparsed-text-available(concat(system-property('user.dir'),'/',$path))"/>
</xsl:function>
using this unparsed-text-available(concat(system-property('user.dir'),'/filename.text'))=false()
will mean that file does not exist.
Have fun!
It can't solely be done by standard XSLT, you have to use an extention function or some annoying workaround. There are two methods using extension functions: use of standard java/.NET for custom functions (works with some versions of Saxon, AltovaXML, and others), or use of processor specific extension functions, like saxon:file-last-modified()/saxon:last-modified(). You can find some sample code here, look for intern:file-exists().
If you can't use extension functions, you can either generate an XML file externaly which contains informations about your file system and pass it to your stylesheet, or you can wrap binary images within SVG and than use fn:doc-available().