Hi Michael,

In version

Saxon-SA 9.1.0.2J from Saxonica
Java version 1.6.0_03

I'm running into "ArrayIndexOutOfBoundsException" when doing a transformation with "-val" and reading lots of source documents.

The bit of code that is running into the trouble seems to be

    public boolean isNilled(int nodeNr) {
        return (typeCodeArray != null && (typeCodeArray[nodeNr] & NodeInfo.IS_NILLED) != 0);
    }

The offending code isn't very interesting:

        <xsl:template match="schema-element(EquityIndexComposition)"
                      as="element(lt:dateAndCodes, lt:DateAndCodes)">

                <xsl:param name="fn:indexCode" as="xs:string" />
               
                <!-- <xsl:message select="concat('EIC: ', base-uri())" /> -->

                <xsl:element name="lt:dateAndCodes" type="lt:DateAndCodes" >                                        
                        <xsl:attribute name="indexCode" select="$fn:indexCode"  />
                        <xsl:attribute name="indexDate" select="@Delta"         />

                        <xsl:apply-templates select="Constituent" />
                </xsl:element>
        </xsl:template>
       
        <xsl:template match="element(Constituent)" as="element(lt:code, xs:string)">
                <xsl:element name="lt:code" type="xs:string" >
                        <xsl:value-of select="@symbol" />
                </xsl:element>
        </xsl:template>


Stack Trace:

java.lang.ArrayIndexOutOfBoundsException: 4931
        at net.sf.saxon.tinytree.TinyTree.isNilled(TinyTree.java:1007)
        at net.sf.saxon.tinytree.TinyNodeImpl.isNilled(TinyNodeImpl.java:737)
        at net.sf.saxon.type.BuiltInAtomicType.getTypedValue(BuiltInAtomicType.java:757)
        at net.sf.saxon.tinytree.TinyNodeImpl.getTypedValue(TinyNodeImpl.java:102)
        at net.sf.saxon.instruct.SimpleContentConstructor.evaluateItem(SimpleContentConstructor.java:297)
        at net.sf.saxon.instruct.ValueOf.processLeavingTail(ValueOf.java:243)
        at net.sf.saxon.instruct.Instruction.process(Instruction.java:93)
        at net.sf.saxon.instruct.ElementCreator.processLeavingTail(ElementCreator.java:296)
        at net.sf.saxon.instruct.Template.applyLeavingTail(Template.java:203)
        at net.sf.saxon.instruct.ApplyTemplates.applyTemplates(ApplyTemplates.java:345)
        at net.sf.saxon.instruct.ApplyTemplates.apply(ApplyTemplates.java:210)
        at net.sf.saxon.instruct.ApplyTemplates.processLeavingTail(ApplyTemplates.java:174)
        at net.sf.saxon.instruct.Block.processLeavingTail(Block.java:556)
        at net.sf.saxon.instruct.Instruction.process(Instruction.java:93)
        at net.sf.saxon.instruct.ElementCreator.processLeavingTail(ElementCreator.java:296)
        at net.sf.saxon.instruct.Block.processLeavingTail(Block.java:556)
        at net.sf.saxon.instruct.Template.applyLeavingTail(Template.java:203)
        at net.sf.saxon.instruct.ApplyTemplates.applyTemplates(ApplyTemplates.java:345)
        at net.sf.saxon.instruct.ApplyTemplates.apply(ApplyTemplates.java:210)
        at net.sf.saxon.instruct.ApplyTemplates.process(ApplyTemplates.java:170)
        at net.sf.saxon.instruct.ElementCreator.constructElement(ElementCreator.java:376)
        at net.sf.saxon.instruct.ElementCreator.evaluateItem(ElementCreator.java:322)
        at net.sf.saxon.expr.ExpressionTool.evaluate(ExpressionTool.java:296)
        at net.sf.saxon.expr.LetExpression.eval(LetExpression.java:339)
        at net.sf.saxon.expr.LetExpression.processLeavingTail(LetExpression.java:540)
        at net.sf.saxon.instruct.Block.processLeavingTail(Block.java:556)
        at net.sf.saxon.instruct.Instruction.process(Instruction.java:93)
        at net.sf.saxon.expr.ItemChecker.process(ItemChecker.java:182)
        at net.sf.saxon.expr.LetExpression.processLeavingTail(LetExpression.java:551)
        at net.sf.saxon.instruct.Template.applyLeavingTail(Template.java:203)
        at net.sf.saxon.instruct.ApplyTemplates.applyTemplates(ApplyTemplates.java:345)
        at net.sf.saxon.instruct.ApplyTemplates.apply(ApplyTemplates.java:210)
        at net.sf.saxon.instruct.ApplyTemplates.process(ApplyTemplates.java:170)
        at net.sf.saxon.instruct.ElementCreator.constructElement(ElementCreator.java:376)
        at net.sf.saxon.instruct.ElementCreator.evaluateItem(ElementCreator.java:322)
        at net.sf.saxon.expr.ExpressionTool.evaluate(ExpressionTool.java:296)
        at net.sf.saxon.expr.ExpressionTool.lazyEvaluate(ExpressionTool.java:432)
        at net.sf.saxon.instruct.ApplyTemplates.apply(ApplyTemplates.java:191)
        at net.sf.saxon.instruct.ApplyTemplates.processLeavingTail(ApplyTemplates.java:174)
        at net.sf.saxon.instruct.Template.expand(Template.java:220)
        at net.sf.saxon.Controller.transformDocument(Controller.java:1822)
        at net.sf.saxon.Controller.transform(Controller.java:1621)
        at net.sf.saxon.Transform.processFile(Transform.java:1112)
        at net.sf.saxon.Transform.doTransform(Transform.java:719)
        at com.saxonica.Transform.main(Transform.java:40)
Fatal error during transformation: java.lang.ArrayIndexOutOfBoundsException: 4931

FWIW, Attaching the entire stylesheet.  (You may need peril-sensitive sunglasses.)


<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fn="fn"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:saxon="http://saxon.sf.net/"
  xmlns:lt="http://com.hsbc.cibm.sed/LocalType"
  version="2.0" exclude-result-prefixes="xs fn xsl saxon">

        <xsl:import href="dmdsQueries.xslt" />
        <!-- <xsl:import href="instMapQueries.xslt" /> -->
       
          <xsl:output indent="yes" />
       
        <!-- fn:XDS is the DMDS instance that will be used in the URI chains. -->
        <xsl:param    name="fn:XDS" as="xs:string" select="'ldnuat'" />

        <!-- fn:MAX is the number of indices to process maximum (for debugging). -->
        <xsl:param    name="fn:MAX" as="xs:integer" select="30" />
       
        <!-- import the schemas the the DMDS documents -->
        <xsl:import-schema schema-location="dmds:ldnuat:getSchema:EquityIndexComposition" />
        <!-- <xsl:import-schema schema-location="dmds:ldnuat:getSchema:InstrumentMap" /> -->

        <!--
        An example for David VO that determines and prints the list
        of indices that a component is in and the entry/exit dates
        for each component.
         
        In this example, we iterate over the list of all indices to recover
        the different components (stocks) that constitute the index.
        We construct the entry/exit dates for each constituent in the index.
        It's possible to have more than one entry/exit date for single component
        in the same index, so make sure that we get a list of entry/exit dates.
       
        Once we've compiled the list of component/index/entry/exit dates, we can
        assemble the table of that information.
       
        Alan Painter
        4 Dec 2008
        -->

        <!-- DMDS document pathname to be used in the URL -->
        <xsl:variable name="fn:IXCOLPATH" as="xs:string" select="'EquityIndexComposition/official/*/PARIS/INTRADAY/*/sophis2'" />
        <xsl:variable name="fn:INDOCPATH" as="xs:string" select="'InstrumentMap/official/latest/PARIS/A/sophis2'" />

        <!-- Set a reusable prefix for loading documents from DMDS.  -->
        <xsl:variable name="fn:LOADPREF" as="xs:string" select="concat('dmds:', $fn:XDS, ':load:')" />
       
        <!-- for readability below, set the docNames for the different documents. -->
        <xsl:param name="fn:IXCOL" as="xs:string" select="concat($fn:LOADPREF, $fn:IXCOLPATH)" />
        <xsl:param name="fn:INDOC" as="xs:string" select="concat($fn:LOADPREF, $fn:INDOCPATH)" />
       
        <!-- Variable holding the list of all index symbols with sophis2 names. -->
        <xsl:variable name="fn:indices" as="element(line, QueryResultsLine)*"
                      select="fn:dmdsQuery(concat(
                                                     'dmds:', $fn:XDS, ':queryValues:', 'EquityIndexComposition',
                                                                                  '?
                                                                                   indexColumns = name/symbol
                                                                                   &amp;
                                                                                   condition    = header/protocol = ''official''
                                                                                   and          name/location   = ''PARIS''
                                                            and          name/marketTime = ''INTRADAY''
                                                            and          name/name       = ''sophis2''
                                                             '))/queryResults/line" />

        <!--  Declare the type for the output document.
              This is really to facilitate debugging and to allow static type checking.
        -->
        <xsl:import-schema namespace="http://com.hsbc.cibm.sed/LocalType" >
                <xs:schema targetNamespace="http://com.hsbc.cibm.sed/LocalType"
                           xmlns="http://com.hsbc.cibm.sed/LocalType"
                           xmlns:xs="http://www.w3.org/2001/XMLSchema"
                           elementFormDefault="qualified">
                           
                        <xs:complexType name="IndexTableLine">
                                <xs:attribute name="constit"   type="xs:string"  use="required"/>
                                <xs:attribute name="index"     type="xs:string"  use="required"/>
                                <xs:attribute name="entryDate" type="xs:date"    use="required"/>
                                <xs:attribute name="exitDate"  type="xs:date"    use="optional"/>
                        </xs:complexType>
                       
                        <xs:complexType name="IndexTable">
                                <xs:sequence>
                                        <xs:element name="indexTableLine" type="IndexTableLine"
                                                    minOccurs="0" maxOccurs="unbounded"/>
                                </xs:sequence>
                        </xs:complexType>

                        <xs:element name="indexTable" type="IndexTable"/>

                        <xs:complexType name="DateAndCodes">
                                <xs:sequence>
                                        <xs:element name="code" type="xs:string"
                                                    minOccurs="0" maxOccurs="unbounded"/>
                                </xs:sequence>
                                <xs:attribute name="indexCode"  type="xs:string"  use="required"/>
                                <xs:attribute name="indexDate"  type="xs:date"    use="required"/>
                        </xs:complexType>
                       
                        <xs:complexType name="DateAndCodesParent">
                                <xs:sequence>
                                        <xs:element name="dateAndCodes" type="DateAndCodes"
                                                    minOccurs="0" maxOccurs="unbounded"/>
                                </xs:sequence>
                        </xs:complexType>
                       
                       
                </xs:schema>
       
        </xsl:import-schema>
       
        <xsl:template name="indxComp5" >
               
                <xsl:variable name="fn:compIndexEntryExit" as="schema-element(lt:indexTable)" >
                        <xsl:element name="lt:indexTable" type="lt:IndexTable" >
                                <xsl:apply-templates select="$fn:indices/column[1]/text()" mode="INDICES"/>
                        </xsl:element>
                </xsl:variable>
               
                <xsl:apply-templates select="$fn:compIndexEntryExit" />
               
        </xsl:template>


        <xsl:template match="text()" mode="INDICES"
                      as="element(lt:indexTableLine, lt:IndexTableLine)*">
       
                <xsl:variable name="fn:uri"
                                      select="concat($fn:IXCOL,
                                                     '? condition = name/symbol=',
                                                      '''',
                                                      current(),
                                                      ''''
                                                      )" />

                <xsl:message select="$fn:uri" />

                <!-- Retrieve the documents from the collection into this typed variable -->
                <xsl:variable name="fn:indexCompDocs"
                              as="document-node(schema-element(EquityIndexComposition))*"
                              select="collection($fn:uri)/saxon:discard-document(.)"
                />
               
                <xsl:variable name="fn:root" as="element(lt:root, lt:DateAndCodesParent)">
                        <xsl:element name="lt:root" type="lt:DateAndCodesParent" >
                                <xsl:apply-templates select="$fn:indexCompDocs/EquityIndexComposition" >
                                        <xsl:with-param name="fn:indexCode" as="xs:string" select="current()" />
                                </xsl:apply-templates>
                        </xsl:element>
                </xsl:variable>

                <!-- <xsl:message select="$fn:root" /> -->

                <!-- Get all of the constituents for all index days -->
                <xsl:variable name="fn:allConstits" as="xs:string*"
                                          select="distinct-values($fn:root/lt:dateAndCodes/lt:code)" />
                                         

                <!--
                       
                <xsl:element name="lt:indexTableLine" type="lt:IndexTableLine" >
                        <xsl:attribute name="constit"   select="'YO'"           />
                        <xsl:attribute name="index"     select="."              />
                        <xsl:attribute name="entryDate" select="current-date()" />
                </xsl:element>

                -->
               
                <xsl:message select="concat('ALL: ', string-join($fn:allConstits, ' '))" />

                <xsl:for-each select="distinct-values($fn:allConstits)" >
               
                        <xsl:variable name="fn:curConstit" as="xs:string" select="current()" />
                       
                        <xsl:for-each select="$fn:root/lt:dateAndCodes[fn:isEntryDate(., $fn:curConstit)]" >

                                <!-- <xsl:message select="concat('ENTRYDATE: ', $fn:curConstit, '@', @indexDate)" />  -->

                                <xsl:element name="lt:indexTableLine" type="lt:IndexTableLine" >
                                        <xsl:attribute name="constit"   select="$fn:curConstit"   />
                                        <xsl:attribute name="index"     select="@indexCode"    />
                                        <xsl:attribute name="entryDate" select="@indexDate"       />
                                        <xsl:variable  name="fn:exitDate"  as="xs:date?"
                                                                                    select="fn:getExitDate(., $fn:curConstit)" />
                                        <xsl:if test="exists($fn:exitDate)">
                                                <xsl:message select="concat('EXITDATE: ', $fn:curConstit, '@', @indexDate), '##', $fn:exitDate" />
                                                <xsl:attribute name="exitDate" select="$fn:exitDate" />
                                        </xsl:if>
                                </xsl:element>

                        </xsl:for-each>
                </xsl:for-each>                
        </xsl:template>

        <xsl:template match="schema-element(EquityIndexComposition)"
                      as="element(lt:dateAndCodes, lt:DateAndCodes)">

                <xsl:param name="fn:indexCode" as="xs:string" />
               
                <!-- <xsl:message select="concat('EIC: ', base-uri())" /> -->

                <xsl:element name="lt:dateAndCodes" type="lt:DateAndCodes" >                                        
                        <xsl:attribute name="indexCode" select="$fn:indexCode"  />
                        <xsl:attribute name="indexDate" select="@Delta"         />

                        <xsl:apply-templates select="Constituent" />
                </xsl:element>
        </xsl:template>
       
        <xsl:template match="element(Constituent)" as="element(lt:code, xs:string)">
                <xsl:element name="lt:code" type="xs:string" >
                        <xsl:value-of select="@symbol" />
                </xsl:element>
        </xsl:template>
       
        <!-- Return true if this is the date that the component entered into index. -->
        <xsl:function name="fn:isEntryDate" as="xs:boolean" >
                <xsl:param name="fn:dateAndCodes" as="element(*, lt:DateAndCodes)" />
                <xsl:param name="fn:curConst" as="xs:string" />
               
                <!--
                <xsl:message select="concat('ENTRYDATE: ', $fn:curConst,
                                            '  DATE: ',    $fn:dateAndCodes/@indexDate,
                                            '  CONSTS: ',  string-join($fn:dateAndCodes/lt:code, ' '))" />

                <xsl:message select="concat('  PRECDATE: ', $fn:dateAndCodes/preceding-sibling::*[1]/@indexDate)" />
                <xsl:message select="concat('  PRECONTS: ', string-join($fn:dateAndCodes/preceding-sibling::*[1]/lt:code, ' '))" />
                -->
                <xsl:sequence select="($fn:curConst = ($fn:dateAndCodes/lt:code))
                                      and
                                      (not($fn:curConst = ($fn:dateAndCodes/preceding-sibling::*[1]/lt:code))) "/>
        </xsl:function>

        <!-- Assuming that we start with an element that is an entry, find exit, if there is one -->
        <xsl:function name="fn:getExitDate" as="xs:date?" >
                <xsl:param name="fn:dateAndCodes" as="element(*, lt:DateAndCodes)" />
                <xsl:param name="fn:curConst" as="xs:string" />
                <xsl:sequence select="($fn:dateAndCodes/following-sibling::*[not($fn:curConst = (lt:code))])[1]/@indexDate "/>
        </xsl:function>

        <!-- Generic identity-copy rule -->        
        <xsl:template match="@*|node()" mode="#all" priority="-1">
                  <xsl:copy validation="preserve">
                    <xsl:apply-templates select="@*|node()" mode="#current" />
                  </xsl:copy>
        </xsl:template>

</xsl:stylesheet>


thanks for any help

Alan PAINTER
IT Project Manager | HTS SED ITD Execution and Arbitrage
15, rue Vernet, 75419 Paris, France

_____________________________________________________

Phone   +33 (0) 1 40 70 31 19
Mobile   +33 (0) 6 75 13 29 29
Email   alan.painter@hsbc.fr
_____________________________________________________ Ensemble adoptons des gestes responsables : N'imprimez ce mail que si necessaire. Les informations contenues dans ce message et les pieces jointes (ci-apres denomme le message) sont confidentielles et peuvent etre couvertes par le secret professionnel. Si vous n'etes pas le destinataire de ce message, il vous est interdit de le copier, de le faire suivre, de le divulguer ou d'en utiliser tout ou partie. Si vous avez recu ce message par erreur, nous vous remercions de le supprimer de votre systeme, ainsi que toutes ses copies, et d'en avertir immediatement HSBC France et ses filiales par message de retour. Il est impossible de garantir que les communications par messagerie electronique arrivent en temps utile, sont securisees ou denuees de toute erreur, alteration, falsification ou virus. En consequence, HSBC France et ses filiales declinent toute responsabilite du fait des erreurs, alterations, falsifications ou omissions qui pourraient en resulter. Consider the environment before printing this mail. The information contained in this e-mail is confidential. It may also be legally privileged. If you are not the addressee you may not copy, forward, disclose or use any part of it. If you have received this message by error, please delete it and all copies from your system and notify the sender immediately by return e-mail. E-mail communications cannot be guaranteed to be timely secure, error or virus-free. The sender does not accept liability for any errors or omissions which arise as a result.