RE: [xsl] exsl:node-set and Saxon 6.5.5

Subject: RE: [xsl] exsl:node-set and Saxon 6.5.5
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 21 Feb 2007 23:51:53 -0000
The implementation of exsl:node-set() in Saxon 6.x is a bit of a hack. A
result tree fragment in Saxon 6.x is a document node, with a special bit set
to say "I am a result tree fragment": this bit artifically disables
operations such as "/" applied to the document node. The effect of
exsl:node-set() is to unset this bit in situ, thus enabling such operations.
A bit dirty, but the XSLT spec allows extension functions to do anything you
like, so it's not technically non-conformant.

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


> -----Original Message-----
> From: Manfred Staudinger [mailto:manfred.staudinger@xxxxxxxxx] 
> Sent: 21 February 2007 22:21
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] exsl:node-set and Saxon 6.5.5
> 
> Hi All,
> 
> As I rely heavily on the superb diagnostics of Saxon when 
> testing client-side (browser) XSLT 1.0 I would like to 
> understand the following.
> 
> When I run the stylesheet below with SAXON 6.5.5 (with two 
> <xsl:copy-of statements) then the (unexpected) output is
> 
> <?xml version="1.0" encoding="utf-8"?>
> <test>
>    <Title>From exsl:node-set($rtf)/a/b:</Title>
>    <b>
>       <c>
>          <d/>
>       </c>
>    </b>
>    <Title>Directly from $rtf/a/b/c:</Title>
>    <c>
>       <d/>
>    </c>
> </test>
> 
> However, if I delete the first <xsl:copy-of then I get this 
> error message from the other one
>    To use a result tree fragment in a path expression, either
>    use exsl:node-set() or specify version='1.1'
> as I think correctly.
> 
> Did I miss something XSLT-wise ?
> 
> Regards, Manfred
> 
> <?xml version="1.0" encoding="UTF-8" ?>
> <xsl:stylesheet version="1.0"
> 	xmlns:exsl="http://exslt.org/common";
> 	exclude-result-prefixes="exsl"
> 	xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> <xsl:output indent="yes"/>
> 
> <xsl:template match="/">
> 	<xsl:variable name="rtf">
> 		<a>
> 			<b>
> 				<c>
> 					<d />
> 				</c>
> 			</b>
> 		</a>
> 	</xsl:variable>
> 	<test>
> 		<Title><xsl:text>From 
> exsl:node-set($rtf)/a/b:</xsl:text></Title>
> 		<xsl:copy-of select="exsl:node-set($rtf)/a/b"/>
> 		<Title><xsl:text>Directly from 
> $rtf/a/b/c:</xsl:text></Title>
> 		<xsl:copy-of select="$rtf/a/b/c"/>
> 	</test>
> </xsl:template>
> </xsl:stylesheet>

Current Thread