velocity-user mailing list archives

Hello,
See below ...
bob mcwhirter wrote:
>
> > I'm attempting to use the #match directive with unions to match one node
> > or another:
> > #match( "aaa | bbb" )
> > What I'm finding is it matches "aaa" nodes but not "bbb" nodes.
> >
> > The real easy way to reproduce this is to modify
> > examples/simple/docs/example1.dvsl changing:
> > #match("document")
> > to
> > #match("aaa | document")
> > it will then fail to match on "document" and not output the <html>
> > section. However, changing it to:
> > #match("document | aaa")
> > does work.
> >
> > I'm assuming this is really a dom4j issue so I upgraded to version 1.2 but
> > this hasn't helped. I'm attempting to reproduce this using the dom4j
> > API's. In the meantime, I'm open to suggestions.
>
> dom4j uses Jaxen (http://jaxen.org/) under the covers for XPath stuff,
> so if you want to boil things down to original sources, I suggest...
>
> 1) Try a Document.selectNodes(...) through the dom4j API.
>
> If that fails...
>
> 2) Try XPath.selectNodes( doc ) through the Jaxen API.
>
> At one point, we didn't have the union operator working right, but
> I think it's been fixed for a while, and dom4j 1.2 should have
> integrated the latest jaxen sources, I think.
I wrote a little program that does something like the above:
XPath xpathSelector = DocumentHelper.createXPath(xpath);
List results = xpathSelector.selectNodes(doc);
The above works fine. But it doesn't matter because DVSL isn't doing it
that way. The #match directive ultimately calls
.dvsl.TemplateHandler.registerMatch with:
Pattern pattern = DocumentHelper.createPattern( xpath );
Rule rule = new Rule( pattern );
which are saved in a HashMap for use when rendering the template. Then in
the render method of the same class, it's passed a dom4j Node and tests it
with:
if( xpathrule.matches( dom4jnode ) )
Using the following, I was able to reproduce the problem:
Pattern pattern = DocumentHelper.createPattern( "aaa | bbb" )
Rule rule = new Rule( pattern );
Element root = doc.getRootElement();
System.out.println("root element: " + root.getName());
if (rule.matches(root))
System.out.println("match found!");
This succeeds for an <aaa> element but fails for a <bbb> element. I'll
take this over to the dom4j-dev list ...
Thanks,
-Bill
--
To unsubscribe, e-mail: <mailto:velocity-user-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:velocity-user-help@jakarta.apache.org>