NULL::something

Login via flickr, はてな, TypeKey.

2004-12-22

結果ツリーフラグメント

注意 これは間違ってるかもしれない。実際に実装を使って確かめたわけじゃない。今はめんどくさくて確かめたくないので覚書的なもの。

変数バインドエレメント (xsl:param, xsl:variable) では select でノードセット格納するときと、子要素にテンプレートを書いてごちゃるのとでは違うらしい。後者は結果ツリーフラグメント (Result Tree Fragment) になる。これはルートノードを含む。(select の場合でもルートノードを含むように選択すればルートノードは含まれる。例えば document() を単体で使えば必ずルートノードがノードセットの入る)

<xsl:variable name="foo" select="/bar"/>
<xsl:apply-templates select="$foo"/>
<xsl:variable name="foo">
    <xsl:copy-of select="/bar"/>
</xsl:variable>
<xsl:apply-templates select="$foo"/>

前者の場合、ルートノードを含まないノードセットなので、無限ループに陥らずにちゃんとなる。後者の書き方によって $foo に格納されるのは結果ツリーフラグメントで、結果ツリーフラグメントはルートノードを含むので、(現在適用しているスタイルシートの match="/" にマッチして) 無限ループ。

結果ツリーフラグメントをノードセットと混同するとエラい目にあう。例えば Mozilla がクラッシュしたりとか。

  • 結果ツリーフラグメントは、結果ツリーの断片 (フラグメント) を表す。結果ツリーフラグメントは、ルートノードを1つだけ含むノード集合と同様に扱われる。
  • 変数バインドエレメントが select アトリビュートを持たず、コンテンツが空でない場合 (つまり、変数バインドエレメントが1つまたは複数の子ノードを持っている場合)、変数バインドエレメントのコンテンツが変数の値になる。変数バインドエレメントのコンテンツはテンプレートであり、このテンプレートをインスタンス化すると、変数の値が得られる。この値は結果ツリーフラグメントであり、このフラグメントはテンプレートをインスタンス化して生成した一連のノードを子に持つルートノードを1つだけを含むノード集合と同等である。

あっていれば xsl:param にノード集合を渡す。 はノード集合ではなく正確には結果ツリーフラグメントだ。まぁ扱い方的はあまり変わらないけれど……

ってことは <xsl:param name="ggg" select="'unke'"/><xsl:param name="ggg">unke</xsl:param> は違うんだ。実際これらを <xsl:value-of select="$ggg"/> とかやると文字列に変換されるので同じように見えるだけか。この場合前者の方が変換がなくてほんの少し高速かな。

Inserted at 2004-12-22T12:32:47+09:00

Trackback URI: http://lowreal.net/logs/2004/12/22/1.trackback

XPath の紛らわしさ

XPathXPath という名前だけでも誤解を招く。Path というだけにディレクトリパスとかを連想する。まぁ、ディレクトリパスとは類似点が多い。UNIX ファイルシステムにおけるルートディレクトリ (名前ナシ) と、ルートノード (展開された名前ナシ) とか、それに省略形による表記を使うとパット見ディレクトリを特定するためのディレクトリパスとなんら変わらない。‘/’ を区切りに使うのが紛らわしい。カレントディレクトリXSLT における カレントノード を混同しやすい。XPath にはカレントノードなんてものはない。コンテキストノード。

XPath は文字列とか数値も表現しえるので、ただたんにどっかのノードを特定する言語ではない。(とはいえ W3C 仕様書には XPath は、XML ドキュメントの一部をアドレッシングするための言語であり とか書いてあって紛らわしい)

だめだもう寝る。

Trackback URI: http://lowreal.net/logs/2004/12/22/2.trackback

IE

IE (Gecko, Opera, etc) を無視するのと、音声ブラウザを無視するのはおなじ。

Comments (2)

哀's image
哀 says:
>IE 正鵠ですな。   どうでもいいけど、どの記事へのコメントかは送信者が送信者の方法で示さないとならないですね。
2004-12-23T10:59:57+09:00
cho45(砂糖)'s image
cho45(砂糖) says:
そうなんすよね。レイアウトはともかく保存するときはどのセクションへの反応かを保存しておいたほうがいい気がしてます。むむー
2004-12-23T11:23:23+09:00

Trackback URI: http://lowreal.net/logs/2004/12/22/3.trackback

NULL

RSS feed meter for http://lowreal.net/logs/latest

Alternates

  1. RSS 1.0
  2. Atom 1.0

Generated with Taglibro

この日記は Taglibro と呼ばれる XML ベースの XSLT をテンプレートとして使ったシステムを使っています。現在の Taglibro は Ruby, ruby-xslt, libxml-ruby による実装です。ソースコードはとりあえず公開していません。