名前空間で区別したノードを、XPath式一発で取得する

ちょっと前に仕事で考えることがあったので、
忘れないうちに書いておく

//*[local-name()='hoge' and namespace-uri()='fuga']

これで

<?xml version='1.0'?>
<root><ns:hoge xmlns:ns='fuga'></ns:hoge></root>

とかってXMLから真ん中のノードが取れる(ハズ)

詳細は、気が向いたら週末にでも追記する。

(追記)

何が問題だったか
たいていのXPathライブラリは、実際のXPath実行の前に、
“これから使うXPath式では、名前空間fugaを表すプレフィックスとして「fugapx」を使いますよ”みたいな準備をする。
で、そのあと

//fugapx:hoge

みたいな式を実行してノードを取得する。なのでプログラム的には1行でとりにくい。
しかもこの中の「fugapx」は単なる接頭辞でしかなく、
ほんとに重要なのは名前空間fugaなのに、XPath式にfugaが出てこないのだ。
これが遠回りしているように感じさせていた。
しかも対象のXML名前空間が変われば、
前述の名前空間プレフィックスの対応を定義する部分のコードも改めて書き直さねばならず、
修正範囲はXPath式にとどまらない。


つまり対象のXMLがどんなに変わろうとも、変えるのはXPath式だけにしたくて、
(遅くてもいいから)どんなノードも取れるXPath式を考えたかった。
で最初の式が出てきた次第でして。


アレなら、名前空間が変わったら、XPath式内の名前空間(namespace-uri()で比較している部分)を変えればいいし、
タグが変わったなら、XPathの名前比較(local-name)の部分を変えれば終了。
プレフィックスが変わったくらいなら、何も変える必要はない。
そして、名前空間プレフィックスの対応を定義する部分のコードも不要となる(はず)

以上。