Bug 49578

Summary: XPath handling only supports single reference to variable
Product: Taglibs Reporter: Jeremy Boynes <jboynes>
Component: Standard TaglibAssignee: Tomcat Developers Mailing List <dev>
Status: RESOLVED FIXED    
Severity: normal    
Priority: P2    
Version: 1.2.0   
Target Milestone: ---   
Hardware: PC   
OS: All   

Description Jeremy Boynes 2010-07-09 15:11:47 UTC
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.
Comment 1 Jeremy Boynes 2010-07-09 15:20:59 UTC
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).
Comment 2 Jeremy Boynes 2010-12-31 18:19:44 UTC
Fixed with refactoring of XPath support in r1054175