It seems like an issue with Xalan's XPath implementation. The Standard 1.1
taglib uses Xalan while Standard 1.0 uses Jaxen/SAXPath. Here's an example app
that mimics what it sounds like Flavio is trying to do:

import java.io.*;
import javax.xml.parsers.*;
import org.apache.xpath.*;
import org.w3c.dom.*;
import org.xml.sax.*;

public class XPathNode {

    private static final String XML =
        "<root name=\"root\"><child name=\"child\"><grandchild
name=\"grandchild\"></grandchild></child></root>";

    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new InputSource(new StringReader(XML)));
        Element root = doc.getDocumentElement();
        Node node = root.getFirstChild();
        NodeList nodes = null;

        nodes = XPathAPI.selectNodeList(doc, "/root/child/@name");
        printNodes(nodes);

        nodes = XPathAPI.selectNodeList(node, "/@name");
        printNodes(nodes);

        nodes = XPathAPI.selectNodeList(node, "./@name");
        printNodes(nodes);
    }

    public static void printNodes(NodeList nodes) {
        System.out.println("nodes:");
        for (int i = 0, n = nodes.getLength(); i < n; i++) {
            Node node = nodes.item(i);
            System.out.println("\t" + node);
        }
    }
}

Which results in:

nodes:
    name="child"
nodes:
nodes:
    name="child"

Notice that for the XPath evaluation to work with "node", I had to prepend "."
to the expression. I'm not sure if it's possible to construct something similar
with the "select" attribute of JSTL's x tags...

Quoting "Johnson, Chris" <[EMAIL PROTECTED]>:

> I see.  I ran across a similar problem with JDOM Xpath, although they
> solved it in a newer version, but totally screwed up the API and some
> other stuff, so it killed the fix for me.
> 
> I had performance problems with the xml jstl tags (forEach), so I've
> since moved on to using xslt.  They're clearly not in a big hurry to fix
> these (what we would consider big) problems.
> 
> Chris
> 
> -----Original Message-----
> From: Flavio Tordini [mailto:[EMAIL PROTECTED] 
> Sent: Wednesday, September 08, 2004 10:36 AM
> To: Tag Libraries Users List
> Subject: Re: using Node variables with JSTL XML tags
> 
> 
> hi chris,
> thank you for your answer. The problem is i'm actually passing a *Node* 
> to the tag, not a Document. So I'd like to evaluate the XPath starting 
> from that Node, not from the root of the Document the Node belongs to.
> 
> I also tried:
> <x:forEach select="$node">
>    <x:out select="@name"/>
> </x:forEach>
> 
> and it works. But it's kind of a hack. I'm not searching for a 
> workaround, I need a clean solution since i'm working on a project that 
> aims to simplify JSP development with the aid of the JSTL + plus a 
> custom Servlet, and I cannot expect people to use this "forEach" hack.
> 
> flavio
> 
> Johnson, Chris wrote:
> > It seems that what 1.1 is doing is more correct.
> > 
> > How do you expect jstl to find your sub node without telling it how to
> 
> > get there?  That's how it works in directories on a computer (unix or 
> > pc).  The only way that I know of to go to a subnode without providing
> 
> > the full path is by using the // operator, like: 
> > select="$doc//subnode". Otherwise, the only way (that I know of) to 
> > "cd" to a subnode, and therefore not have to give the full path is by 
> > using x:forEach.
> > 
> > Chris
> > 
> > -----Original Message-----
> > From: Flavio Tordini [mailto:[EMAIL PROTECTED]
> > Sent: Wednesday, September 08, 2004 9:37 AM
> > To: Tag Libraries Users List
> > Subject: Re: using Node variables with JSTL XML tags
> > 
> > 
> > hi all,
> > In the list archive, I found that the same question has been asked in
> > June e never answered:
> > 
> > http://www.mail-archive.com/[EMAIL PROTECTED]/msg07315.h
> > tm
> > l
> > 
> > should I post to the dev mailing list?
> > should I report a bug?
> > 
> > please someone answer!
> > 
> > flavio
> > 
> > Flavio Tordini wrote:
> > 
> >>hi all,
> >>I'm experimenting with the JSTL XML tags. I have a org.w3c.dom.Node 
> >>variable and I'm trying to use the JSTL with it. Something like:
> >>
> >><x:out select="$node/@name"/>
> >>
> >>The odd thing is that the XPath expression is evaluated relative the 
> >>document root, not to the specified node. The following works:
> >>
> >><x:out select="$node/full/path/to/node/@name"/>
> >>
> >>I cannot find an explanation in the JSTL 1.1 spec. The only thing I 
> >>found is in section 11.1.3:
> >>
> >>"An XPath expression must also treat variables that resolve to 
> >>implementations of standard DOM interfaces as representing nodes of
> > 
> > the
> > 
> >>type bound to that interface by the DOM specification."
> >>
> >>Is this behaviour by design? Is it compliant with the spec?
> >>
> >>Thank you in advance,
> >>flavio

-- 
Kris Schneider <mailto:[EMAIL PROTECTED]>
D.O.Tech       <http://www.dotech.com/>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to