These days we're not active xslt developers, though we still consider xslt and xquery are important part of our personal experience and self education.
Besides, we have a pretty large xslt code base that is and will be in use. We think xslt/xquery is in use in many other big and small projects thus they have a strong position as a niche languages.
Thus we think it's important to help to those who support xslt/xquery engines. That's what we're regularly doing (thanks to our code base).
Now, to the problem we just have found. Please consider the code:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="this" exclude-result-prefixes="xs t"> <xsl:template match="/"> <xsl:param name="new-line-text" as="xs:string" select="' '"/> <xsl:variable name="items" as="item()*" select="'select', $new-line-text"/> <xsl:message select="t:string-join($items)"/> </xsl:template> <!-- Joins adjacent string items. $items - items to join. Returns joined items. --> <xsl:function name="t:string-join" as="item()*"> <xsl:param name="items" as="item()*"/> <xsl:variable name="indices" as="xs:integer*" select=" 0, index-of ( ( for $item in $items return $item instance of xs:string ), false() ), count($items) + 1"/> <xsl:sequence select=" for $i in 1 to count($indices) - 1 return ( $items[$indices[$i]], string-join ( subsequence ( $items, $indices[$i] + 1, $indices[$i + 1] - $indices[$i] - 1 ), '' ) )"/> </xsl:function> </xsl:stylesheet>
The output is:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 at net.sf.saxon.om.Chain.itemAt(Chain.java:161) at net.sf.saxon.om.SequenceTool.itemAt(SequenceTool.java:130) at net.sf.saxon.expr.FilterExpression.iterate(FilterExpression.java:1143) at net.sf.saxon.expr.LetExpression.iterate(LetExpression.java:365) at net.sf.saxon.expr.instruct.BlockIterator.next(BlockIterator.java:49) at net.sf.saxon.expr.MappingIterator.next(MappingIterator.java:70) at net.sf.saxon.expr.instruct.Message.processLeavingTail(Message.java:264) at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:660) at net.sf.saxon.expr.instruct.Template.applyLeavingTail(Template.java:239) at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:1057) at net.sf.saxon.Controller.transformDocument(Controller.java:2088) at net.sf.saxon.Controller.transform(Controller.java:1911) ...
The problem is reported at: Exception during execution in Saxon-HE-9.5.1-6 and also tracked at https://saxonica.plan.io/issues/2104.
Update: according to Michael Kay the issue is fixed. See note #4:
I have committed a patch to Chain.itemAt() on the 9.5 and 9.6 branches to check for index<0
Remember Me
a@href@title, b, blockquote@cite, em, i, strike, strong, sub, super, u