The XPath union expression "$src/root/x | $src/root/y" is not handled correctly as only the first set of nodes is returned. For example, the JSP <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> <x:parse var="src"> <root> <x>one</x> <x>two</x> <x>three</x> <y>a</y> <y>b</y> </root> </x:parse> <x:forEach select="$src/root/x | $src/root/y"> <x:out select="."/> </x:forEach> only displays the "x" elements. Swapping the arms of the union operator returns the "y" elements.
This appears to be because of the transformation of the expression performed in XPathUtil#adaptParamsForXalan which takes a variable reference at the start of the expression and maps to a context node. The documentation implies this is because: * Given all of this, if no context node is set for the evaluation * of the XPath expression, one must be set so Xalan * can successfully evaluate a JSTL XPath expression. * (it will not work if the context node is given as a varialbe * at the beginning of the expression) However, Xalan is able to handle variable references like this through its VariableStack API (or as a XPathVariableResolver when called via the JAXP API).
Fixed with refactoring of XPath support in r1054175