Checking whether a file exists in XSLT

I need to write a stylesheet which checks the value of an attribute to see if it is the name of an existing file. You can't do it directly in XSLT of course, so I am following the advice of Mike Kay (https://www.oxygenxml.com/archives/xsl-list/200506/msg00400.html) and trying to do it with a java extension in an XSLT2 stylesheet. Here's the relevant template, which I run with saxon EE within oXygen 18.1 <xsl:template match="tei:pb"> <xsl:variable name="filename" as="xs:string"> <xsl:value-of select="@facs"/> </xsl:variable> <xsl:variable name="resolvedFile" as="xs:anyURI" select="resolve-uri(@facs, base-uri(.))"/> <xsl:message> <xsl:value-of select="concat($filename, ' resolves to ', $resolvedFile)"/> </xsl:message> <xsl:if test="not(fs:exists(fs:new($resolvedFile)))" xmlns:fs="java.io.File"> <xsl:value-of select="concat($filename, ' Not Found')"/> </xsl:if> <xsl:text> </xsl:text> </xsl:template> The messages produced tell me that the filenames are being resolved correctly (they are all relative URLs like this ../../something/foo/foo.jpg) but the test always returns true, whether the file concerned exists or not. Am I missing something obvious? Or not obvious? This has been driving me nuts all day...

I just tested you code (also with oXygen 18.1 but with minimal modifications on a dita map) and it worked fine: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="3.0"> <xsl:mode name="#default" on-no-match="shallow-skip"/> <xsl:template match="topicref"> <xsl:variable name="filename" as="xs:string"> <xsl:value-of select="@href"/> </xsl:variable> <xsl:variable name="resolvedFile" as="xs:anyURI" select="resolve-uri(@href, base-uri(.))"/> <xsl:message> <xsl:value-of select="concat($filename, ' resolves to ', $resolvedFile)"/> </xsl:message> <xsl:if test="not(fs:exists(fs:new($resolvedFile)))" xmlns:fs="java.io.File"> <xsl:value-of select="concat($filename, ' Not Found')"/> </xsl:if> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet> I'd recommend you to create a similar minimal sample to make sure the problem lies really within this piece of code. Patrik ------------------------------------------------------------------ Systemarchitektur & IT-Projekte Tel: +49 40 33449-1142 Fax: +49 40 33449-1400 E-Mail: mailto:Patrik.Stellmann@gdv-dl.de -----Ursprüngliche Nachricht----- Von: oXygen-user [mailto:oxygen-user-bounces@oxygenxml.com] Im Auftrag von Lou Burnard Gesendet: Donnerstag, 12. Januar 2017 19:59 An: oxygen-user@oxygenxml.com Betreff: [oXygen-user] Checking whether a file exists in XSLT I need to write a stylesheet which checks the value of an attribute to see if it is the name of an existing file. You can't do it directly in XSLT of course, so I am following the advice of Mike Kay (https://www.oxygenxml.com/archives/xsl-list/200506/msg00400.html) and trying to do it with a java extension in an XSLT2 stylesheet. Here's the relevant template, which I run with saxon EE within oXygen 18.1 <xsl:template match="tei:pb"> <xsl:variable name="filename" as="xs:string"> <xsl:value-of select="@facs"/> </xsl:variable> <xsl:variable name="resolvedFile" as="xs:anyURI" select="resolve-uri(@facs, base-uri(.))"/> <xsl:message> <xsl:value-of select="concat($filename, ' resolves to ', $resolvedFile)"/> </xsl:message> <xsl:if test="not(fs:exists(fs:new($resolvedFile)))" xmlns:fs="java.io.File"> <xsl:value-of select="concat($filename, ' Not Found')"/> </xsl:if> <xsl:text> </xsl:text> </xsl:template> The messages produced tell me that the filenames are being resolved correctly (they are all relative URLs like this ../../something/foo/foo.jpg) but the test always returns true, whether the file concerned exists or not. Am I missing something obvious? Or not obvious? This has been driving me nuts all day... _______________________________________________ oXygen-user mailing list oXygen-user@oxygenxml.com https://www.oxygenxml.com/mailman/listinfo/oxygen-user GDV Dienstleistungs-GmbH & Co. KG Glockengießerwall 1 D-20095 Hamburg www.gdv-dl.de Sitz und Registergericht: Hamburg HRA 93 894 USt.-IdNr : DE 205183123 Komplementärin: GDV Beteiligungsgesellschaft mbH Sitz und Registergericht: Hamburg HRB 71 153 Geschäftsführer: Dr. Jens Bartenwerfer Michael Bathke ------------------------------------------------------------------ Diese E-Mail und alle Anhänge enthalten vertrauliche und/oder rechtlich geschützte Informationen. Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten haben, informieren Sie bitte sofort den Absender und vernichten Sie diese E-Mail. Das unerlaubte Kopieren sowie die unbefugte Weitergabe der E-Mail ist nicht gestattet. This e-mail and any attached files may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorised copying, disclosure or distribution of the material in this e-mail is strictly forbidden.

Many thanks for taking the time to check! Your reassuring reply made me go and check how I was running the code, and yes, of course, I was running it in a context where that "base-uri(.)" was bound to cause confusion. Thanks again! On 13/01/17 07:49, Dr. Patrik Stellmann wrote:
I just tested you code (also with oXygen 18.1 but with minimal modifications on a dita map) and it worked fine:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="3.0">
<xsl:mode name="#default" on-no-match="shallow-skip"/>
<xsl:template match="topicref"> <xsl:variable name="filename" as="xs:string"> <xsl:value-of select="@href"/> </xsl:variable> <xsl:variable name="resolvedFile" as="xs:anyURI" select="resolve-uri(@href, base-uri(.))"/> <xsl:message> <xsl:value-of select="concat($filename, ' resolves to ', $resolvedFile)"/> </xsl:message>
<xsl:if test="not(fs:exists(fs:new($resolvedFile)))" xmlns:fs="java.io.File"> <xsl:value-of select="concat($filename, ' Not Found')"/> </xsl:if> <xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
I'd recommend you to create a similar minimal sample to make sure the problem lies really within this piece of code.
Patrik
------------------------------------------------------------------ Systemarchitektur & IT-Projekte Tel: +49 40 33449-1142 Fax: +49 40 33449-1400 E-Mail: mailto:Patrik.Stellmann@gdv-dl.de
-----Ursprüngliche Nachricht----- Von: oXygen-user [mailto:oxygen-user-bounces@oxygenxml.com] Im Auftrag von Lou Burnard Gesendet: Donnerstag, 12. Januar 2017 19:59 An: oxygen-user@oxygenxml.com Betreff: [oXygen-user] Checking whether a file exists in XSLT
I need to write a stylesheet which checks the value of an attribute to see if it is the name of an existing file. You can't do it directly in XSLT of course, so I am following the advice of Mike Kay (https://www.oxygenxml.com/archives/xsl-list/200506/msg00400.html) and trying to do it with a java extension in an XSLT2 stylesheet. Here's the relevant template, which I run with saxon EE within oXygen 18.1
<xsl:template match="tei:pb"> <xsl:variable name="filename" as="xs:string"> <xsl:value-of select="@facs"/> </xsl:variable> <xsl:variable name="resolvedFile" as="xs:anyURI" select="resolve-uri(@facs, base-uri(.))"/> <xsl:message> <xsl:value-of select="concat($filename, ' resolves to ', $resolvedFile)"/> </xsl:message>
<xsl:if test="not(fs:exists(fs:new($resolvedFile)))" xmlns:fs="java.io.File"> <xsl:value-of select="concat($filename, ' Not Found')"/> </xsl:if> <xsl:text> </xsl:text>
</xsl:template>
The messages produced tell me that the filenames are being resolved correctly (they are all relative URLs like this ../../something/foo/foo.jpg) but the test always returns true, whether the file concerned exists or not. Am I missing something obvious? Or not obvious? This has been driving me nuts all day...
_______________________________________________ oXygen-user mailing list oXygen-user@oxygenxml.com https://www.oxygenxml.com/mailman/listinfo/oxygen-user
GDV Dienstleistungs-GmbH & Co. KG Glockengießerwall 1 D-20095 Hamburg www.gdv-dl.de
Sitz und Registergericht: Hamburg HRA 93 894 USt.-IdNr : DE 205183123
Komplementärin: GDV Beteiligungsgesellschaft mbH Sitz und Registergericht: Hamburg HRB 71 153
Geschäftsführer: Dr. Jens Bartenwerfer Michael Bathke
------------------------------------------------------------------ Diese E-Mail und alle Anhänge enthalten vertrauliche und/oder rechtlich geschützte Informationen. Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten haben, informieren Sie bitte sofort den Absender und vernichten Sie diese E-Mail. Das unerlaubte Kopieren sowie die unbefugte Weitergabe der E-Mail ist nicht gestattet.
This e-mail and any attached files may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorised copying, disclosure or distribution of the material in this e-mail is strictly forbidden. _______________________________________________ oXygen-user mailing list oXygen-user@oxygenxml.com https://www.oxygenxml.com/mailman/listinfo/oxygen-user
participants (2)
-
Dr. Patrik Stellmann
-
Lou Burnard