RE: [xsl] Is this a Saxon 8.0 bug ?

Subject: RE: [xsl] Is this a Saxon 8.0 bug ?
From: "M. David Peterson" <m.david@xxxxxxxxxx>
Date: Sun, 27 Jun 2004 06:34:19 -0600
Hey Dimitre,

I ran the same stylesheets against a build of Saxon 8 that is completely
different than your build (more on that a little later in the week) and
received the exact same error.  But the problem isn't within the
<xsl:sort> its with the max function -> max(f:map($vfunMaxDepth,
$pNode/node())) + 1"/> on line 19 of "func-maxDepth.xsl" file.

I'm looking through your functions now attempting to decipher what is
actually being passed along to the f:map function and the f:apply
function that is causing the max function to throw the number conversion
error but I'll shoot this to you now in case you already know where the
problem might be... 

Hope this helps!
 
<M:D/>
 :: Announcing Saxon.NET (v.8.0-B) Java to C# and .NET Conversion
Project ::
 :: Be part of the project development at
http://www.x2x2x.org/x2x2x/home ::
 
 

> -----Original Message-----
> From: Dimtre Novatchev [mailto:dnovatchev@xxxxxxxxx]
> Sent: Sunday, June 27, 2004 5:56 AM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Is this a Saxon 8.0 bug ?
> 
> In trying XSLT 2.0 to solve the recently posted problem by Mike
> Trotman (see "Sorting subtrees based on their maximum depth.") I came
> up with the following solution:
> 
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> xmlns:f="http://fxsl.sf.net/";
> exclude-result-prefixes="f"
> >
>    <xsl:import href="func-maxDepth.xsl"/>
> 
>    <xsl:output omit-xml-declaration="yes"/>
>    <xsl:strip-space elements="*"/>
> 
>    <!-- This transformation must be applied to:
>         testMaximum3.xml
>     -->
>     <xsl:template match="node()|@*">
>       <xsl:copy>
>         <xsl:apply-templates select="node()|@*"/>
>       </xsl:copy>
>     </xsl:template>
> 
>     <xsl:template match="*[folder]">
>       <xsl:copy>
>         <xsl:copy-of select="@*"/>
>         <xsl:apply-templates select="folder">
>           <xsl:sort select="f:maxDepth(.)" data-type="number"/>
>         </xsl:apply-templates>
> 
>        <xsl:apply-templates select="node()[not(self::folder)]"/>
>       </xsl:copy>
>     </xsl:template>
> 
> </xsl:stylesheet>
> 
> The stylesheet module
>    func-maxDepth.xsl:
>   ===============
> 
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> xmlns:xs="http://www.w3.org/2001/XMLSchema";
> xmlns:f="http://fxsl.sf.net/";
> xmlns:MyMaxDepth="MyMaxDepth"
> exclude-result-prefixes="xs f MyMaxDepth"
> >
>    <xsl:import href="func-map.xsl"/>
> 
>    <xsl:output omit-xml-declaration="yes"/>
> 
>     <xsl:variable name="vfunMaxDepth"
>                   select="document('')/*/MyMaxDepth:*[1]"/>
> 
> 
>      <xsl:function name="f:maxDepth" as="xs:integer">
>        <xsl:param name="pNode" as="node()"/>
> 
>        <xsl:value-of select="if (not($pNode/node())) then 0
>                              else
>                               max(f:map($vfunMaxDepth, $pNode/node()))
+
> 1"/>
>      </xsl:function>
> 
>      <MyMaxDepth:MyMaxDepth/>
>      <xsl:template match="MyMaxDepth:*">
>        <xsl:param name="arg1" as="node()"/>
> 
>        <xsl:sequence select="f:maxDepth($arg1)"/>
>      </xsl:template>
> 
> </xsl:stylesheet>
> 
> The stylesheet module
>   func-map.xsl:
>   ==========
> 
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> xmlns:f="http://fxsl.sf.net/";
> exclude-result-prefixes="f"
> >
>     <xsl:import href="func-apply.xsl"/>
> 
>     <xsl:function name="f:map" as="item()*">
>       <xsl:param name="pFun" as="element()"/>
>       <xsl:param name="pList1" as="item()*"/>
> 
>       <xsl:sequence select=
>        "for $this in $pList1 return
>           f:apply($pFun, $this)"
>       />
>     </xsl:function>
> </xsl:stylesheet>
> 
> And, finally, the stylesheet module
>   func-apply.xsl:
>   ==========
> 
> <xsl:stylesheet version="2.0"
>  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>  xmlns:f="http://fxsl.sf.net/";
>  exclude-result-prefixes="f"
> >
> 
>   <xsl:function name="f:apply">
>    <xsl:param name="pFunc" as="element()"/>
>    <xsl:param name="arg1"/>
> 
>     <xsl:apply-templates select="$pFunc">
>       <xsl:with-param name="arg1" select="$arg1"/>
>     </xsl:apply-templates>
>   </xsl:function>
> </xsl:stylesheet>
> 
> 
> The problem is that when I run the top-most transformation I get the
> following error:
> 
> Saxon 8.0 from Saxonica
> Java version 1.4.2_04
> Stylesheet compilation time: 469 milliseconds
> Processing
> file:/C:/xml/msxml/XML%20SDK/Samples/Tests/Generic/FP/Fxsl/Exslt-
> Based/marrowtr.xml
> Building tree for
> file:/C:/xml/msxml/XML%20SDK/Samples/Tests/Generic/FP/Fxsl/Exslt-
> Based/marrowtr.xml
> using class net.sf.saxon.tinytree.TinyBuilder
> Tree built in 0 milliseconds
> Tree size: 10 nodes, 0 characters, 8 attributes
> Building tree for
> file:/C:/xml/msxml/XML%20SDK/Samples/Tests/Generic/FP/Fxsl/XSLT2/func-
> maxDepth.xsl
> using class net.sf.saxon.tinytree.TinyBuilder
> Tree built in 16 milliseconds
> Tree size: 12 nodes, 0 characters, 15 attributes
> Error at value-of on line 21 of
> file:/C:/xml/msxml/XML%20SDK/Samples/Tests/Generic/FP/Fxsl/XSLT2/func-
> maxDepth.xsl:
>   Failure converting {} to a number
> Transformation failed: Run-time errors were reported
> 
> The run-time error is explained in the last four lines above.
> 
> The source xml document on which the transformation is applied is:
> 
> <root>
> 	<folder name="1">
> 		<folder name="2"/>
> 		<folder name="3">
> 			<folder name="4"/>
> 		</folder>
>                     </folder>
> 	<folder name="6">
> 		<folder name="7">
> 			<folder name="8">
> 				<folder name="9"/>
> 			</folder>
> 		</folder>
> 	</folder>
> </root>
> 
> 
> 
> However, I am able to run simpler transforms calling the function
> f:maxDepth() for every "folder" element of the above xml document,
> e.g. running this transformation:
> 
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> xmlns:f="http://fxsl.sf.net/";
> exclude-result-prefixes="f"
> >
>    <xsl:import href="func-maxDepth.xsl"/>
> 
>    <xsl:output omit-xml-declaration="yes"/>
>    <xsl:strip-space elements="*"/>
> 
>    <!-- This transformation must be applied to:
>         testMaximum3.xml
>     -->
> 
>     <xsl:template match="/">
>       <xsl:value-of select="f:maxDepth(/*/folder[@name=6])"/>
>     </xsl:template>
> 
> </xsl:stylesheet>
> 
> produces the correct result "3" and no error is reported.
> 
> The only difference b/n the two transforms is that in the first,
> problematic one, I am using f:maxDepth within the @select expression
> of xsl:sort.
> 
> So, my question is if I'm doing something wrong in the top-most (first
> in this message) transformation, or is this a bug in Saxon 8 and if
> this is a bug, what is the recommended workaround.
> 
> Thanks to Mike Kay in advance,
> 
> Cheers,
> 
> Dimitre Novatchev.
> 
> --+------------------------------------------------------------------
> XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
> or e-mail: <mailto:xsl-list-unsubscribe@xxxxxxxxxxxxxxxxxxxxxx>
> --+--


Current Thread