Subject: RE: 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: 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('<webSet #', normalize-space(@old), '# =
> #', $var-name, '#> ')"/>
> </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>
|