たしか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』からなら得られるけど……)」とプロセッサに怒られることになる。別の方法を考えた方がよい。
完全に干からびたソフトコンタクトレンズを洗浄液で戻したら復活した。ビックリ。1日過ごしてみたが全く問題なかった。
昨日の夜、ケースにしまったつもりが指にくっついてしまっていたらしく、今日の朝付けようと思ったら左目のレンズだけ行方不明になっていた。外した場所付近を捜索してみると、乾燥してペッチャンコになったレンズの遺体が発見されたので、なんとかして復活させようと洗浄液につけてみた。本来はやるべきではないのだろうが、運悪くストックが切れていて(2週間使い捨て)、他に方法がなかった。片目だけとはいえ、コンタクト無しで外に出るのは恐い。
最初は、1度乾いてしまったら復活はしないだろう、とダメもと気味だったのだが、5分ほど指でグリグリしつつ漬けておくと、形が元に戻ってきた。縁の部分が少しワナワナしていたが、装着してみると予想外に違和感がなかったので、とりあえずそのまま家を出た。
今の時点で既に1日装着していたわけだが、特に問題ない。言うまでもなく、目に悪影響があるかもしれないので、真似はしない方がよいだろう。私も緊急時以外はもうやらないと思う。ただ、ソフトコンタクトは乾燥すると完全に歪むのかと思いきや、きちんと形を保っていたことに、何か感心してしまった。