David Crossley wrote:

Antonio Gallardo wrote:
David Crossley wrote:
Uh'oh, looks like we are one step ahead of ourselves.

See the comments at the Commons JXPath issue:
http://issues.apache.org/bugzilla/show_bug.cgi?id=32360

Also elharo kindly added a note to the Cocoon bug
warning that we might have the wrong fix:
http://issues.apache.org/bugzilla/show_bug.cgi?id=36810

I wonder why he claims we broke the JXPath implementation. I understand the new method in jxpath is a hack, but.....

Well, I think we are learning and that is good. :-) If this is the case, we can try the suggested solution:

Given a simple linkmap.xml as:

*<site* href="" xmlns="http://apache.org/cocoon/linkmap/1.0"*>*
*<myIndex* href="index.html"*/>
</site>

Then the xpath expression "/site/index/@href"

Presume you mean "/site/myIndex/@href"

cannot be used. It returns null. The reason is below.

<snip from="http://www.xml.com/pub/a/2004/02/25/qanda.html";>
*The real difficulty is that XPath syntax needs to satisfy two
irreconcilable requirements: handling elements in a declared but
default (unprefixed) namespace and handling elements in no namespace
at all, which do not have expanded names. In reconciling this dilemma,
the XPath spec says that an unprefixed name /in an XPath
expression/ is assumed to be in an undeclared namespace, even when
the name as it appears /in the instance document/ has (as a
result of a namespace declaration) an expanded name. Thus, |//myIndex| "query" is instructing XPath to
locate an element which does not exist, a
|"myIndex"| element in an undeclared namespace.
</snip>
*

One of the suggested solutions in the document is strip the default namespace form the file. (This was the David solution).

If the above is not posible, then we can also make a simple trick with JXPath:

*context.registerNamespace(foo, "http://apache.org/cocoon/linkmap/1.0
and then write the xpath using it:

*"/foo:site/foo:index/@href"*
*

Yes, that is what i reckon needs to happen in the Linkrewriter
or it gets defined as a parameter for configuration of Cocoon's
input modules, or something. Sorry, i am not a good enough
Cocooner to know where.

One trouble is that we need to handle two possible namespaces.
This Linkrewriter started life at Forrest then moved to Cocoon.
http://apache.org/forrest/linkmap/1.0 http://apache.org/cocoon/linkmap/1.0
Hi,

See below....

Best Regards,

Antonio Gallardo.
*

* Starry, starry night at your place is it Antonio * * * :-)

?? The "stars" where placed by Thunderbird, not by me. I am sorry for that. BTW, you are right, today is a starry night here. How do you knew that! ;-) lol.

I am sorry for the errors in my last post. I was in a hurry trying to send the information to the list and I don't reviewed it as usually I do.

The good news is that the commons-jxpath community seems to accept and want to keep the request "enhancement". See:

http://issues.apache.org/bugzilla/show_bug.cgi?id=32360#c26

The bad news is that seems like we are not using xpath 1.0 in the linkRewriterTransformer.

I wonder is we used XPath 1.0 notation in the LinkRewriter transformer since day 1? Is XPath 1.0 the desired expression language? I think we never used XPath 1.0 or maybe we used it in the beginnng when the linkmap.xml did not contain a default namespace.

I have a question, why we need a namespace in the linkmap.xml at all?

If we really need a default namespace in the linkmap.xml, then let's use the correct behavior for XPath 1.0 in the linkrewriter. Hence, use something like:

/linkmap:site/linkmap:myIndex/@href for the linkmap rewriter.


The 3rd solution is (not too easy?):

1- Detect a default namespace URI
2-Create a "weird" namespace prefix and register it with the default namespace 
URI
3-Rewrite the "location xpath expression" using the generated namespace prefix.

Sample:

Given the linkmap:

<site href="" xmlns="http://apache.org/cocoon/linkmap/1.0";>
<myIndex href="index.html"/>
</site>

and given the location xpath expression:

/site/myIndex/@href

1- Detect the default namespace URI:
Output: http://apache.org/cocoon/linkmap/1.0

2-Generate a dummy namespace prefix: cgnp.
 Output: context.registerNamespace("dummy", 
"http://apache.org/cocoon/linkmap/1.0";);

3- Rewrite the xpath expression
  Output: /dummy:site/dummy:myIndex/@href


How sounds this solution?

Best Regards,

Antonio Gallardo.

P.S: Me expecting this time thunderbird does not wrote a lot of stars inbetween 
mail. :-)