Jintrick.netagenda2003年09月アーカイブ → 2003年09月18日

document(ノード集合) の例(XSLT 1.0)

XSLT 1.0 のdocument関数が、唯一つの引数をもち、それがノード集合である場合について、例示します。今回は見た目の煩雑を避けるため、XPath式は省略記法を使用していますが、省略記法を推奨するものではありません。

次のような解析された(パース済み)XMLツリーがあったとします。

<Bookmark>
 <url>./object1.xml</url>
 <url>./object2.xml</url>
 <url>./object3.xml</url>
</Bookmark>

これに対して、次の式は何を返却するでしょうか:

前回document関数の概要(XSLT1.0) (agenda)で示した定義を再掲します:

従って、document(/Bookmark/url)は次の 3つの式の和集合と等価です。

つまりdocument(/Bookmark/url) は次の式と等価です:

まず、document(string(/Bookmark/url[1]), /Bookmark/url[1])から見てみます。これは、string関数によって次のように展開されます。

ここで、第一引数 './object1.xml' を相対URI、/Bookmark/url[1] というノードの Base URI を基底URIとして、絶対URIが導出されます。

Base URIは通常、そのノードが存在するXML文書のURIになります。そのノードが外部実体であった場合には、その実体のURIになります。従って、/Bookmark/url[1] の Base URIを知るには、解析前のXML文書を見なければなりません。

先ほど例示した解析済みXMLツリーは、実は次のようなXML文書の一部でした。


<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE test [
 <!ENTITY fragment1 SYSTEM
  "./depth1/fragment1.xml">
 <!ENTITY fragment2 SYSTEM
  "./depth1/depth2/fragment2.xml">
 <!ENTITY fragment3 SYSTEM
  "./depth1/depth2/depth3/fragment3.xml">
]>

<Bookmark>
 &fragment1;
 &fragment2;
 &fragment3;
</Bookmark>

例えば&fragment1 は外部実体の参照で、SYSTEM識別子 './depth1/fragment1.xml' で表されるリソース<url>./object1.xml</url>が実体になっています。このXML文書の所在が http://www.example.com/ であったとすれば、相対URIの形をとっているSYSTEM識別子は http://www.example.com/depth1/fragment1.xml に解決されます。

/Bookmark/url[1]というノードの Base URIは、&fragment1; の実体のURIである http://www.example.com/depth1/fragment1.xml となります。

従って、document('./object1.xml', /Bookmark/url[1])における第一引数 ./object1.xml は絶対URI http://www.example.com/depth1/object1.xml に解決されます。

即ち、document('./object1.xml', /Bookmark/url[1])は次の式と等価です。

同様にして、その他の二つのdocument関数:

これらも、次のように展開されると考えることが出来ます。

そして、この三つのdocument関数の結果の和集合が、最終的にdocument(/Bookmark/url)の結果となります。この場合、3つ文書のルートノードを含んだノード集合です。

クライアントサイドのXSLTを使った実験

ブラウザのXSLTプロセッサを利用した実験です。Windows版Internet Explore 6 で確認しましたが、object1 object2 object3 (順不同) と表示されれば成功です。

注意点


webmaster@jintrick.net
公開: 2003年09月18日
カテゴリ: XSLT