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[@colname='col2']"/>
<xsl:value-of select="$start[position() mod $grp-size=1]"/>
through
<xsl:apply-templates mode="varstate" select=". | following-
sibling::row[position() < $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() < $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[@colname='col1']"/>
<xsl:variable name="errnum" select="entry[@colname='col2']"/>
<xsl:variable name="errmsg" select="entry[@colname='col3']"/>
<xsl:variable name="poss-cause" select="entry[@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[@colname='col2']"/>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>