[xquery-talk] Xquery to xslt conversions

David Carlisle davidc at nag.co.uk
Wed Jan 11 17:20:15 PST 2006


 
  Also, how are you handling the XQuery "order by" problem: what XSLT code do
  you generate for pathological cases like

  for $x in 1 to 10, $y in 100 to 200
  order by $y, $x
  return $x + $y


Actually as I document in the xq2xsl notes, that is the non-pathological
case where a somewhat simpler and more efficient mapping to xslt can be
used. The two ranges are independent so can be pulled out of the loop
and you know in advance how many tuples you need to iterate over.
I document the simpler mapping at 
http://monet.nag.co.uk/xq2xml/xq2xslnotes.html#s5


but actually I only implement the more general case where the range of
the later variables depends on earlier variables, for example


for $x in 1 to 10, $y in $x to 200
order by $y, $x
return $x + $y



I've just noticed that my documentation of the general case ends with

     The main disadvantage of all this is that the expressions F($i)
     above that generate the sequences get evaluated multiple times and
     might be expensive, This could be optimised by the convertor (for
     example detecting the case that the sequences do not depend on the
     range variables, and so using the method in the previous section,
     but some of the optimisations are probably more easily done by the
     XSLT compiler. For example I believe Saxon does not evaluate
     variables that are never used, so there is no real need for the
     convertor to analyse the expressions and see if all the variables
     defined are needed.

Is my trust in saxon justified here?

or should I work harder and explictly omit the expressions

         <xsl:variable name="xq:p2" select="$xq:index[2]"/>
         <xsl:variable name="y" select="(( 100  to  200 ))[$xq:p2]"/>

in which is setting up the range variable $y which then isn't used in
(this) sort expression.


      <xsl:for-each select="$xq:here">
         <xsl:variable name="xq:index" select="for $i in string-to-codepoints(.) return($i - 32)"/>
         <xsl:variable name="xq:p1" select="$xq:index[1]"/>
         <xsl:variable name="x" select="(( 1  to  10 ))[$xq:p1]"/>
         <xsl:variable name="xq:p2" select="$xq:index[2]"/>
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         <xsl:variable name="y" select="(( 100  to  200 ))[$xq:p2]"/>
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         <xsl:sequence select="$x"/>
      </xsl:for-each>

David

________________________________________________________________________
This e-mail has been scanned for all viruses by Star. The
service is powered by MessageLabs. For more information on a proactive
anti-virus service working around the clock, around the globe, visit:
http://www.star.net.uk
________________________________________________________________________


More information about the talk mailing list