velocity-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bill Burton" <bi...@progress.com>
Subject Re: [DVSL] #match and unions fail?
Date Wed, 06 Mar 2002 01:57:19 GMT
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>


Mime
View raw message