[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Is this a Saxon 8.0 bug ?

Subject: Is this a Saxon 8.0 bug ?
From: Dimtre Novatchev <dnovatchev@xxxxxxxxx>
Date: Sun, 27 Jun 2004 21:56:18 +1000
omit xml declaration saxon
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.

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.