velocity-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Geir Magnusson Jr." <ge...@optonline.net>
Subject Re: [DVSL] #match and unions fail?
Date Wed, 06 Mar 2002 03:39:19 GMT
On 3/5/02 8:57 PM, "Bill Burton" <billb@progress.com> wrote:

> 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 ...

I've got another problem with using the Rule() - it doesn't seem to match
for nodes that were found using the identical Xpath...  I've sent a note to
james, and I'll join you over on the dom4j list...

-- 
Geir Magnusson Jr.                                     geirm@optonline.net
System and Software Consulting
Java : the speed of Smalltalk with the simple elegance of C++... 


--
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