xsl-list
[Top] [All Lists]

RE: [xsl] Saxon processing problem...

2008-03-30 08:01:34

This suprisingly ordinary code:

<xsl:apply-templates mode="stategroup" select="//tbody/row[position() mod
$grp-size=1]"/>

has found a bug in the Saxon optimizer where it repeatedly adds nodes to the
compiled expression tree to perform sorting into document order. Because
this is a sensitive area of the code, it's going to require some thought to
fix it properly. For you, however, the simplest thing is just to correct
your code: That leading "//" is incorrect and it has only confused matters.
The other thing that would make the optimizer's life much easier is to
declare the types of parameters such as $grp-size, in this case using
'as="xs:double"' in the xsl:param declaration.

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

 

-----Original Message-----
From: Robert Wilkins [mailto:wilkins(_dot_)robert(_at_)comcast(_dot_)net] 
Sent: 29 March 2008 17:46
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Saxon processing problem...




All of this should work, did work, but doesn't.  The source 
document contains an error message table. The stylesheet 
should simply grab a group of rows from a table, and write 
the results to a set of result- documents based on a 
group-size parameter. I am using several other stylesheets 
that perform similar tasks, and all of them work. This source 
document is DITA-based; the others are not. Any help would be 
greatly appreciated.

Error #1 -
If use Saxon8 or Saxon9 and try to output to a 
<result-document> from the command line, I get a 
java.lang.StackOverflowError. If I use Saxon9B in Eclipse 
(w/oXygenxml), I get an error that says "[Saxon9B]
null  Ant_Doc/xsl     mkpreprocerrs.xsl       Unknown 
1206732845515 291"

Error #2
If I comment the <result-document> tags and use Saxon6.5.5 in 
Oxygen, the transformations occur, but the title and short 
description content in the output appear after the 
declaration, like this :


<?xml version="1.0" encoding="utf-8"?>Source document 
titleShort decription content <!DOCTYPE reference
    PUBLIC "-//OASIS//DTD DITA Reference//EN" 
"Reference.dtd"> <reference id="allprocerrs1-ref">
     <title id="allprocerrs1-title">Messages 2601 through 2621</title>

Source Document

<?xml version="1.0"?>
<!DOCTYPE reference PUBLIC "-//OASIS//DTD DITA Reference//EN"  
"reference.dtd">
    <reference id="allpreprocerrs_ref">
       <title>Source document title</title> <shortdesc> Short 
decription content/shortdesc>
       <refbody>
          <table id="allpperrs_tbl">
             <tgroup cols="5">
                <colspec colnum="1" colname="col1" colwidth="1*"/>
                <colspec colnum="2" colname="col2" colwidth="1*"/>
                <colspec colnum="3" colname="col3" colwidth="3*"/>
                <colspec colnum="4" colname="col4" colwidth="3*"/>
                <colspec colnum="5" colname="col5" colwidth="1*"/>
                <thead>
                   <row>
                      <entry colname="col1" 
align="center">Type</entry>
                      <entry colname="col2" align="center">Number</ 
entry>
                      <entry colname="col3" align="center">Message</ 
entry>
                      <entry colname="col4" 
align="center">Possible Cause</entry>
                      <entry colname="col5" 
align="center">UltraLite</ 
entry>
                   </row>
                </thead>
                <tbody>
                   <row>
                      <entry colname="col1" align="left">
                         <p>Error</p>
                      </entry>
                      <entry colname="col2">
                         <p>2601</p>
                      </entry>
                      <entry colname="col3" align="left">
                         <p>subscript value %1 too large</p>
                      </entry>
                      <entry colname="col4">
                         <p>You have attempted to index a 
host variable that is an array with a value too large for the 
array.</p>
                      </entry>
                      <entry colname="col5">
                         <p>False</p>
                      </entry>
                   </row>
                   <row>
                      <entry colname="col1" align="left">
                         <p>Error</p>
                      </entry>
                      <entry colname="col2">
                         <p>2602</p>
                      </entry>
                      <entry colname="col3" align="left">
                         <p>combined pointer and arrays not 
supported for host types</p>
                      </entry>
                      <entry colname="col4">
                         <p>You have used an array of 
pointers as a host variable. This is not legal.</p>
                      </entry>
                      <entry colname="col5">
                         <p>False</p>
                      </entry>
                   </row>
                   <row>
                      <entry colname="col1" align="left">
                         <p>Error</p>
                      </entry>
                      <entry colname="col2">
                         <p>2603</p>
                      </entry>
                      <entry colname="col3" align="left">
                         <p>combined pointer and arrays not 
supported for host types</p>
                      </entry>
                      <entry colname="col4">
                         <p>You have attempted to declare a 
host variable as an array of character arrays. This is not a 
legal host variable type</p>
                      </entry>
                      <entry colname="col5">
                         <p>False</p>
                      </entry>
                   </row>
                   <row>
                      <entry colname="col1" align="left">
                         <p>Error</p>
                      </entry>
                      <entry colname="col2">
                         <p>2604</p>
                      </entry>
                      <entry colname="col3" align="left">
                         <p>VARCHAR type must have a length</p>
                      </entry>
                      <entry colname="col4">
                         <p>You have attempted to declare a 
VARCHAR or BINARY host variable using the DECL_VARCHAR or 
DECL_BINARY macro but have not specified
                            a size for the array.
                         </p>
                      </entry>
                      <entry colname="col5">
                         <p>False</p>
                      </entry>
                   </row>
                   <row>
                      <entry colname="col1" align="left">
                         <p>Error</p>
                      </entry>
                      <entry colname="col2">
                         <p>2605</p>
                      </entry>
                      <entry colname="col3" align="left">
                         <p>arrays of VARCHAR not supported</p>
                      </entry>
                      <entry colname="col4">
                         <p>You have attempted to declare a 
host variable as an array of VARCHAR or BINARY. This is not a 
legal host variable type.</p>
                      </entry>
                      <entry colname="col5">
                         <p>False</p>
                      </entry>
                   </row>
                   <row>
                      <entry colname="col1" align="left">
                         <p>Error</p>
                      </entry>
                      <entry colname="col2">
                         <p>2606</p>
                      </entry>
                      <entry colname="col3" align="left">
                         <p>VARCHAR host variables cannot be 
pointers</p>
                      </entry>
                      <entry colname="col4">
                         <p>You have attempted to declare a 
host variable as a pointer to a VARCHAR or BINARY. This is 
not a legal host variable type.</p>
                      </entry>
                      <entry colname="col5">
                         <p>False</p>
                      </entry>
                   </row>
                </tbody>
             </tgroup>
          </table>
       </refbody>
    </reference>

Stylesheet

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";  
version="2.0">

      <xsl:output method="text"/>
      <xsl:output method="xml"
              doctype-public="-//OASIS//DTD DITA Composite//EN"
              doctype-system="reference.dtd"
              indent="yes"
              name="xml"/>
              
      <xsl:strip-space elements="*"/>
      <xsl:param name="grp-size" select="number(20)"/>

      <xsl:template match="//table">
              <xsl:apply-templates mode="stategroup" 
select="//tbody/row[position
() mod $grp-size=1]"/>
      </xsl:template>

      <xsl:template match="//tbody/row" mode="stategroup">
       <xsl:variable name="num">
                      <xsl:number count="row[position() mod 
$grp-size=1]"/>
      </xsl:variable>
               <xsl:variable name="filename" 
select="concat('output/preprocerrs/
preprocerr',$num)"/>
              <xsl:result-document href="{$filename}" format="xml">
              
                      <xsl:variable name ="ref-id" 
select="concat('preproc', $num,'- ref' )"/>
                      <xsl:variable name ="ttl-id" 
select="concat('preproc', $num,'- ttl' )"/>
                      <xsl:variable name ="tbl-id" 
select="concat('preproc', $num,'- tbl' )"/>

                              <reference id="{$ref-id}">
                                      <title 
id="{$ttl-id}">Preprocessing Errors
                                              <xsl:variable 
name="start" select="./entry[(_at_)colname='col2']"/>
                                              <xsl:value-of 
select="$start[position() mod $grp-size=1]"/> through
                                              
<xsl:apply-templates mode="varstate" select=". | following-
sibling::row[position() &lt; $grp-size]">
                                              </xsl:apply-templates>
                                      </title>
                                      <shortdesc></shortdesc>
                                      <refbody>
                                              <table id="{$ttl-id}">
                                              <tgroup cols="4">
                                                      
<colspec column="1" colname="col1" colwidth="1*"/>
                                                      
<colspec column="2" colname="col2" colwidth="2.25*"/>
                                                      
<colspec column="3" colname="col3" colwidth="1*"/>
                                                      
<colspec column="4" colname="col5" colwidth="2.25*"/>
                                              <thead>
                                                      <row>
                                                              
<entry colname="col1" align="center">Error Code</entry>
                                                              
<entry colname="col1" align="center">Type</entry>
                                                              
<entry colname="col1" align="center">Message</entry>
                                                              
<entry colname="col1" align="center">Possible Cause</entry>
                                                      </row>
                                              </thead>
                                      <tbody>
                                              
<xsl:apply-templates mode="stateitem" select=". |
following-sibling::row[position() &lt; $grp-size]">
                                              </xsl:apply-templates>
                                      </tbody>
                                      </tgroup>
                              </table>
                              </refbody>
                      </reference>
              </xsl:result-document>
      </xsl:template>
      
      
      <xsl:template match="//row" mode="stateitem">
              <xsl:variable name="msg-type" 
select="entry[(_at_)colname='col1']"/>
              <xsl:variable name="errnum" 
select="entry[(_at_)colname='col2']"/>
              <xsl:variable name="errmsg" 
select="entry[(_at_)colname='col3']"/>
              <xsl:variable name="poss-cause" 
select="entry[(_at_)colname='col4']"/>
              
              <row>

                      <entry colname="col1" align="left" valign="top">
                              <xsl:value-of select="$msg-type"/>
                      </entry>
                      <entry colname="col2" align="left" valign="top">
                              <xsl:value-of select="$errnum"/>
                      </entry>
                              <entry colname="col3" 
align="left" valign="top">
                              <xsl:value-of select="$errmsg"/>
                              </entry>
                      <entry colname="col4" align="left" valign="top">
                              <xsl:value-of select="$poss-cause"/>
                      </entry>
              </row>
      </xsl:template>
      
      
      <xsl:template match="//row" mode="varstate">
              <xsl:choose>
                      <xsl:when test="position()=last()">
                              <xsl:value-of 
select="entry[(_at_)colname='col2']"/>
                      </xsl:when>
              </xsl:choose>
      </xsl:template>
      
      
</xsl:stylesheet>


--~------------------------------------------------------------------
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(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
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(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--