たしかSablotronの1.0だと、xsl:attributeのname属性の値に「xmlns」を与えても通ってしまった気がする。
It is an error if the string that results from instantiating the attribute value template is not a QName or is the string
xmlns.
本来はエラーにならなくてはいけない。
件の問題は、exclude-result-prefixesで消えるのは接頭辞でなくて、その接頭辞にマップされた名前空間そのもので有ることに注意すべきだ。名前空間そのものが消えると、同一の名前空間URIにマップされた全ての接頭辞が無効になる(無効になった接頭辞が使われている場合はどうするか、はまた別の話だ)。
大抵の場合、この問題が発生するのは、デフォルト名前空間用の接頭辞が存在しない事が原因になっているようだ。メインとなるXHTMLの名前空間をデフォルトとした場合、xsl:templateのmatch属性に与えるべきパターンで接頭辞が使えなくなってしまい、結局何らかの名前で接頭辞を宣言し直す必要が出てくる。
この問題はグローバル属性の接頭辞にも影響がある。例えばデフォルト名前空間がXHTMLの物だった場合、XHTMLのclass属性やid属性などをグローバル属性として使うことが出来なくなる。言うまでもなく、(デフォルトだからと言って)接頭辞無しの属性を書けば、それは当然グローバル属性ではなく、ただの属性である。この場合も有効なグローバル属性を記述するためには、何かしらの名前で接頭辞を宣言し直す必要がある。
話を戻すが、>>370の解説は間違っている。この場合、エレメントノードの持つ展開名は「"http://www.w3.org/1999/xhtml" + "p"」になる。展開名には接頭辞から得られた名前空間URIは関係してくるが、接頭辞そのものは単なる手がかりでしかない。つまり、同じ名前空間URIにマップされた接頭辞ならどれでも使って良い、というのが引用されている文章から分かる範囲での解釈になる。この例では、入れ替わる接頭辞は全て同じ名前空間URIにマップされているのだから、>>370の理由により実装を批判することは不適切といえるだろう。
特に、この例はexclude-result-prefixで名前空間を削除している可能性が高いので、実装が状況に合わせて接頭辞を付けたとしても文句は言えないのではないだろうか。
さらに突っ込みを入れると、最初の例の
<xsl:element name="{name()}"/>
は危険である。この場合、name()が返すのはソース文章でのQNameである。ソース文章では「xh」だった接頭辞がXSL文章内では「x」で宣言されていたりすると、「接頭辞『xh』から有効な名前空間URIを得ることが出来ません(『x』からなら得られるけど……)」とプロセッサに怒られることになる。別の方法を考えた方がよい。
http://yudai.arielworks.com/memo/2004/09/07/102828.trackback
末尾に「8 + 0」の計算結果を繋げて下さい。例えば計算結果が「17」の場合、「102828.trackback17」です。これは機械的なトラックバックスパムを防止するための措置です。