ネームスペース宣言の集合は、式が現れるアトリビュートを持つエレメントのスコープに含まれるものと同じである。この集合には、XML ネームスペース勧告 (XML Namespaces Recommendation) [XML Names] が必要とする、暗黙的に示されたプレフィックス xml の宣言も含まれる。デフォルトのネームスペース (xmlns を用いて宣言されたもの) は、この集合の一部ではない。
とか書いてあったりする。ソースツリーのデフォルトネームスペース URI が null (特に名前空間を全く宣言していない場合とか) 以外の時は絶対にプリフィックス無しではマッチとかしない。
<foo> <bar>baz</bar> </foo>
この場合に string(/foo/bar) = 'baz'
は true。
<foo xmlns="http://foo/"> <bar>baz</bar> </foo>
この場合は string(/foo/bar) = 'baz'
は false。/foo/bar
は何も選択しない。例え XSLT 側のデフォルト名前空間が http://foo/ であっても何も選択されない。xmlns:f="http://foo/"
とかやって /f:foo/f:bar
ってやらなきゃいけない。
で、困るっていうかよくわからんのはソースツリーのデフォルトネームスペースと結果ツリーのデフォルトネームスペースを同じにしたいときなんですよと。必然的に xmlns:f="http://foo/"
と xmlns="http://foo/"
とか (順番も重要) やるわけですよ。exclude-result-prefixes="f"
とかやるわけですよ。そうすると仕様書的に正しいかはよくわからないけど Sablotron の場合はどっちとも (xmlns, xmlns:f) 消えるんですよ (msxsl では大丈夫)。で、どうすんねんと哀さんと話していた次第(謎
xsl:namespace-alias とか利用すんのかなぁと思っていくつかソレっぽく書いてみたけどダメだった……なんかセオリー的なやり方ってないのかな。