jaxenのXPathパーザーのバグ

XPath評価エンジンjaxenに長らく見つかっていなかった XPath 1.0 仕様書に則っていなかったバグが見つかったようで。
http://jira.codehaus.org/browse/JAXEN-193

jaxenはDOMやJDOM,XOM,dom4jXPath 1.0 式を使用して結果を取ってくるライブラリ(XPath 2.0 サポートはする気が全くないみたい)で、http://jaxen.org から取得できます。
また、maven1やmaven2リポジトリにも登録されているはずです。
ちなみにjaxen.orgは説明やリンク先が間違っている、ソースzipあると書いてあるのに実際には無いなんてことがしょっちゅうあるので注意。落ちてることも。(いい加減もうCVS無いのだからCVSへのリンク削除したらいいのに・・・)

問題のバグですがこれは 文字"*"の構文解析XPath 1.0 の 3.7章「Lexical Structure」の下記の内容に従っていなかったと見られる物です。
原文:http://www.w3.org/TR/xpath#exprlex

If there is a preceding token and the preceding token is not one of @, ::, (, [, , or an Operator, then a * must be recognized as a MultiplyOperator and an NCName must be recognized as an OperatorName.

If the character following an NCName (possibly after intervening ExprWhitespace) is (, then the token must be recognized as a NodeType or a FunctionName.

If the two characters following an NCName (possibly after intervening ExprWhitespace) are ::, then the token must be recognized as an AxisName.

Otherwise, the token must not be recognized as a MultiplyOperator, an OperatorName, a NodeType, a FunctionName, or an AxisName.

日本語訳:http://www.infoteria.com/jp/contents/xml-data/REC-xpath-19991116-jpn.htm#exprlex

前にトークンがあり、そのトークンが @、::、(、 [、, または Operatorではない場合には、* を MultiplyOperator として認識しなければならい (must)。また NCName を OperatorName として認識しなければならない (must)。

NCName の後に続く文字 (ExprWhitespace を間に挟む場合もある) が ( の場合は、そのトークンを NodeType または FunctionName として認識しなければならない (must)。

NCName の後に続く2つの文字 (ExprWhitespace を間に挟む場合もある) が :: の場合は、そのトークンを AxisName として認識しなければならない (must)。

上記以外の場合はトークンを MultiplyOperator または OperatorName、NodeType、FunctionName、AxisName として認識してはならない (must)。

上記の"*"に関するところだけを抜き出すと、@*や、::*、(*、[* や Operator(andやorなど)*の場合は"*"をMultiplyOperator(算数の掛け算記号と考えて貰うと良いです)として認識してはならないとのことです。この場合、"*"は何に該当するかというと3.7章に書いてあるBNF式を追っていくと、NameTestに該当します。まぁ確かに@*などはNameTestなので掛け算と思われたらたまらんわけですが。

これを踏まえ、jaxen-193によるとjaxenで下記のXPath式を処理しようとするとSAXPathExceptionが発生します。
(SAXPathはjaxenの内部で使用されるXPath構文解析エンジンの名前です)

/*[ * or processing-instruction() ]
/*[ processing-instruction() or * ]

修正に結構手間取っていてだれか妙案はない?とMLにて話が出ており(http://archive.jaxen.codehaus.org/dev/14904761.1192805692397.JavaMail.haus-jira%40codehaus01.managed.contegix.com)、一応パッチらしき物は出ていますがまだコミットはされていない模様。(SVNのログ見る限り。http://fisheye.codehaus.org/changelog/jaxen/trunk/jaxen?todate=1209261370459)

実際のコードを見ると分かるのですが"*"は単にどのような場合でもSTARというトークンに分類されており、この辺りが問題ではないかと思われます。いつ直るのかなぁ・・・