Re: [xsl] In XSLT 3.0, should the "document" function be available in xsl:evaluate?

Subject: Re: [xsl] In XSLT 3.0, should the "document" function be available in xsl:evaluate?
From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 16 Jan 2017 19:40:34 -0000
Actually, the spec of fn:function-lookup says:

If the arguments to fn:function-lookup identify a function that is present in
the static context of the function call, the function will always return the
same function that a static reference to this function would bind to. If there
is no such function in the static context, then the results depend on what is
present in the dynamic context, which is B7implementation-definedB7.

I seem to recall there was a fair bit of discussion about situations that
might lead to the dynamic context containing functions not present in the
static context, but I don't recall the details - I think a number of people
had different reasons for suggesting this could be useful. For Saxon,
certainly, it's useful not to have to impose what would be a completely
artificial restriction.

Michael Kay
Saxonica


> On 16 Jan 2017, at 14:35, Martin Honnen martin.honnen@xxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
>
> Both the latest internal draft of the XSLT 3.0 spec in
https://www.w3.org/XML/Group/qtspecs/specifications/xslt-30/html/#dynamic-xpa
th as well as the official https://www.w3.org/TR/xslt-30/#element-evaluate say
about the function signatures in the context of dynamic XPath evaluation using
xsl:evaluate: "Note that this set deliberately excludes XSLT-defined functions
in the standard function namespace".
>
> Based on that I would expect the XSLT "document" function not to be
available in dynamic XPath evaluation using xsl:evaluate. So I wrote a test
case doing
>
> <xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> 	xmlns:xs="http://www.w3.org/2001/XMLSchema";
xmlns:fn="http://www.w3.org/2005/xpath-functions";
> 	xmlns:math="http://www.w3.org/2005/xpath-functions/math";
> 	xmlns:array="http://www.w3.org/2005/xpath-functions/array";
> 	xmlns:map="http://www.w3.org/2005/xpath-functions/map";
> 	exclude-result-prefixes="array fn map math xs">
>
> 	<xsl:output method="xml"/>
>
> 	<xsl:template name="main" match="/">
> 		<xsl:sequence
> 			select="
> 			let $f := function-lookup(xs:QName('fn:document'), 1)
> 			return
> 			if (exists($f)) then
> 			$f('')
> 			else
> 			'not found'"/>
> 		<xsl:variable name="path" as="xs:string">
> 			let $f := function-lookup(xs:QName('fn:document'), 1)
> 			return
> 			if (exists($f)) then
> 			$f('')
> 			else
> 			'not found'</xsl:variable>
> 		<xsl:evaluate xpath="$path"/>
> 	</xsl:template>
>
> </xsl:stylesheet>
>
> and expected that to return the stylesheet code for the xsl:sequence and
'not found' for the xsl:evaluate.
>
> However, only Exselt gives me that result, both Saxon 9.7 EE as well as
Altova XMLSpy return the stylesheet code twice which seems to indicate they
make the 'document' function available to xsl:evaluate. Isn't that a bug? Or
does the spec need to allow it if an implementer wants to go beyond pure XPath
support?

Current Thread