■
- Re:2004-06-05T06:30:05Z (Arielworks.net)
-
問題はデフォルト名前空間を表す接頭辞が定義されていない事ですね。#defaultをQName内で使えないので、xsl:elementで生成する要素の名前空間をデフォルト名前空間に指定する方法が今のところ存在しない訳で。
xsl:element要素のname属性に指定されるQNameがどう展開されるかは、xsl:elementの項に書いてあります。7.1.2 Creating Elements with xsl:element によると:
If the namespace attribute is not present then the QName is expanded into an expanded-name using the namespace declarations in effect for the
xsl:element
element, including any default namespace declaration.xsl:element要素に効力を持っている名前空間宣言達(デフォルト名前空間の宣言も含む)を使って展開名に展開されます。極端な例でいえば:
<xsl:element name="head" xmlns="http://www.w3.org/1999/xhtml"> <xsl:apply-templates select="child::node()|@*" /><!--これ適当--> </xsl:element>
このxsl:element要素はデフォルト名前空間 http://www.w3.org/1999/xhtml を持ったhead要素を生成するべきだと思います。明言されているわけではないのですが。
まず、このxsl:element要素によって、展開名が "http://www.w3.org/1999/xhtml" + "head" となる要素が生成されることは確定しています。また、この展開名は次のような名前空間ノードを参照して決定されます:
- 展開名(名前空間URI + 接頭辞)
- null + ""
- 文字列値
- http://www.w3.org/1999/xhtml
生成されるhead要素の展開名を解決する際に、この名前空間ノードを既に参照しているのですから、接頭辞を勝手につけるなどという実装は嫌がらせ以外の何者でもありません。どう考えても。私なら捨てます。
xsl:element要素にnamespace属性があるいるときには、展開名の解決にこの名前空間ノードは使用されませんから、接頭辞を自前で用意する実装は効率的なのかもしれませんが。