Re: Spurious error on recursive invocation of fn:transform
Michael Kay <mike-JkSD5nQpfvpWk0Htik3J/[email protected]> Wed, 25 Nov 2020 00:08:26 +0000
| Newsgroups | gmane.text.xml.saxon.help |
|---|---|
| Message-ID | <[email protected]> |
Thanks, I've reproduced the problem. As expected, it's all to do with base URIs. I haven't got to the bottom of it yet, but I think the heart of the issue is that <xsl:copy> is creating a document whose base URI is defined to be the same as the stylesheet URI, and then we are using this URI as a key into the document cache for a call on doc(). Which ignores the fact that multiple documents can have the same base URI: the base URI is not a unique identifier for a document. Unfortunately the JAXP interfaces like the Source object and the URIResolver use a single property (systemId) to represent both base URIs and unique document URIs, so it's easy to get them mixed up. Michael Kay Saxonica > On 24 Nov 2020, at 14:57, Ihe Onwuka <[email protected]> wrote: > > > On Tue, Nov 24, 2020 at 7:32 AM Michael Kay <mike-JkSD5nQpfvpWk0Htik3J/[email protected] <mailto:mike-JkSD5nQpfvpWk0Htik3J/[email protected]>> wrote: >> >> The usage of doc('') is not the causation here >> >> stylesheet-node : doc('fullpathToTheStylesheetAsGeneratedWithdocument-uri/myStylesheet.xsl') >> >> the exact same result. >> > > It's not so much the use of doc(""), as the reliance on preservation of a base URI. > > Having said that, if you can put together a repro we'll be happy to look at it. I think it's fairly clear the problem is happening because the base URI is being lost through the call on fn:transform(), but whether losing it is a bug or an application error is something we can only determine if we study the detail. > > Michael Kay > Saxonica > > Here. > > Here is bug.xsl > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform <http://www.w3.org/1999/XSL/Transform>" > xmlns:fn="http://www.w3.org/2005/xpath-functions <http://www.w3.org/2005/xpath-functions>" > xmlns:xs="http://www.w3.org/2001/XMLSchema <http://www.w3.org/2001/XMLSchema>" > xmlns:local="urn:local" > version="3.0" > > > <xsl:mode on-no-match="shallow-copy"/> > <xsl:function name="local:generateNextVersion" as="document-node()"> > <xsl:param name="currentVersion" as="document-node()"/> > <xsl:variable name="isFinalVersion" as="xs:boolean" select="$currentVersion/* eq '3'"/> > <xsl:sequence select="if ($isFinalVersion) > then $currentVersion > else local:generateNextVersion(fn:transform(map { > 'stylesheet-node' : doc(''), > 'source-node' : $currentVersion > })?output)"/> > </xsl:function> > > <xsl:template match="*"> > <xsl:message select="."/> > <xsl:copy> > <xsl:sequence select="let $customizedResult := fn:transform(map { > 'stylesheet-node' : doc('bugs2.xsl'), > 'source-node' : / > })?output > return local:generateNextVersion($customizedResult)"/> > </xsl:copy> > </xsl:template> > > </xsl:stylesheet> > > Here is bugs2.xsl > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform <http://www.w3.org/1999/XSL/Transform>" > xmlns:fn="http://www.w3.org/2005/xpath-functions <http://www.w3.org/2005/xpath-functions>" > version="3.0" > > > <xsl:mode on-no-match="shallow-copy"/> > <xsl:template match="*"> > <xsl:copy> > <xsl:value-of select=". + 1"/> > </xsl:copy> > </xsl:template> > > </xsl:stylesheet> > > Here is input XML > > <bug>1</bug> > > Reproduction instructions. > > Run the transform bug.xsl against input bug.xml and see the xsl:message output below > > <bug>1</bug> > <bug>2</bug> > > Change bug.xsl to test for $currentVersion eq '4' instead of 3 > > crashes as below > > <bug>1</bug> > <bug>2</bug> > Error in bugs2.xsl: > XTSE0150 The supplied file does not appear to be a stylesheet > Static error in bugs2.xsl: > XTSE0150 The supplied file does not appear to be a stylesheet > Error in bugs2.xsl: > XTSE0150 The supplied file does not appear to be a stylesheet > at function local:generateNextVersion in bug.xsl: > invoked by function call > In template rule with match="*" of bug.xsl > invoked by built-in template rule (shallow-copy) > The supplied file does not appear to be a stylesheet > > > > > _______________________________________________ saxon-help mailing list archived at http://saxon.markmail.org/ [email protected] https://lists.sourceforge.net/lists/listinfo/saxon-help