RE: [xsl] document() function and error-handling

Subject: RE: [xsl] document() function and error-handling
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 3 Jan 2008 17:04:52 -0000
You're right, this question is specific to the processor. XSLT 1.0 makes it
implementation-defined what happens when you ask for a non-existent
document, and there's no mechanism in the standard for testing whether the
document exists or for recovering if it doesn't. XSLT 2.0 has a
doc-available() function for this purpose.

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: Scott Trenda [mailto:Scott.Trenda@xxxxxxxx]
> Sent: 03 January 2008 16:49
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] document() function and error-handling
>
> Quick question, might be specific to the MSXML XSLT processor.
>
> I'm trying to reference two different files passed in as
> parameters to a transformation using the document() function.
> If the files are blank or valid URIs (the URI handling is
> correct), the transformation works as expected, but if the
> URI points to a non-existant file, MSXML errors out with code
> 0x800c0006: "The system cannot locate the object specified."
> I'm developing a central framework for several different
> applications, and I don't know if the application is actually
> going to create the file I'm trying to reference here. If it
> doesn't exist, I don't care, I just want to use it in the
> case that it does exist.
>
> I've played around with some different scenarios in the
> stylesheet, and the error occurs any time I try to access the
> variable that contains the result of the document() function,
> even if I only want to check if it's non-empty. Is there any
> more graceful way (for MSXML, in particular) to handle the
> case where the URI passed to document() doesn't exist?
>
> I've included the stylesheet I'm using at the bottom, just in
> case it helps.
>
> ~ Scott
>
>
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> xmlns:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/
> " exclude-result-prefixes="encodingStyle">
>
>             <xsl:param name="framework-map-file"/>
>             <xsl:param name="app-map-file"      />
>
>             <xsl:output method="text" encoding="utf-8"/>
>
>             <xsl:variable name="framework-maps"
> select="document($framework-map-file)"/>
>             <xsl:variable name="app-maps"      
> select="document($app-map-file      )"/>
>             <xsl:variable name="maps"          
> select="$framework-maps/*/map | $app-maps/*/map"/>
>
>             <xsl:template match="*">
>                         <xsl:variable name="var-name">
>                                     <xsl:apply-templates
> select="." mode="name"/>
>                         </xsl:variable>
>                         <xsl:for-each
> select="$maps[normalize-space(@new) = $var-name]">
>                                    <xsl:value-of
> select="concat('&lt;webSet #', normalize-space(@old), '# =
> #', $var-name, '#&gt;&#10;')"/>
>                         </xsl:for-each>
>                         <xsl:apply-templates select="*"/>
>             </xsl:template>
>
>             <xsl:template match="*" mode="name">
>                         <xsl:apply-templates
> select="parent::*" mode="name"/>
>                         <xsl:choose>
>                                     <xsl:when
> test="../@encodingStyle:arrayType">[<xsl:number/>]</xsl:when>
>                                     <xsl:otherwise>
>                                                 <xsl:if
> test="parent::*">.</xsl:if>
>                                                 <xsl:value-of
> select="name()"/>
>                                     </xsl:otherwise>
>                         </xsl:choose>
>             </xsl:template>
>
> </xsl:stylesheet>

Current Thread