XSLT 1.0 のdocument関数が、唯一つの引数をもち、それがノード集合である場合について、例示します。今回は見た目の煩雑を避けるため、XPath式は省略記法を使用していますが、省略記法を推奨するものではありません。
次のような解析された(パース済み)XMLツリーがあったとします。
<Bookmark>
<url>./object1.xml</url>
<url>./object2.xml</url>
<url>./object3.xml</url>
</Bookmark>
これに対して、次の式は何を返却するでしょうか:
document(/Bookmark/url)
前回document関数の概要(XSLT1.0) (agenda)で示した定義を再掲します:
従って、document(/Bookmark/url)
は次の 3つの式の和集合と等価です。
document(string(/Bookmark/url[1]), /Bookmark/url[1])
document(string(/Bookmark/url[2]), /Bookmark/url[2])
document(string(/Bookmark/url[3]), /Bookmark/url[3])
つまりdocument(/Bookmark/url)
は次の式と等価です:
document(string(/Bookmark/url[1]), /Bookmark/url[1]) | document(string(/Bookmark/url[2]), /Bookmark/url[2]) | document(string(/Bookmark/url[3]), /Bookmark/url[3])
まず、document(string(/Bookmark/url[1]), /Bookmark/url[1])
から見てみます。これは、string関数によって次のように展開されます。
document('./object1.xml', /Bookmark/url[1])
ここで、第一引数 './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('http://www.example.com/depth1/object1.xml')
同様にして、その他の二つのdocument関数:
document(string(/Bookmark/url[2]), /Bookmark/url[2])
document(string(/Bookmark/url[3]), /Bookmark/url[3])
これらも、次のように展開されると考えることが出来ます。
document('http://www.example.com/depth1/depth2/object2.xml')
document('http://www.example.com/depth1/depth2/depth3/object3.xml')
そして、この三つのdocument関数の結果の和集合が、最終的にdocument(/Bookmark/url)
の結果となります。この場合、3つ文書のルートノードを含んだノード集合です。
ブラウザのXSLTプロセッサを利用した実験です。Windows版Internet Explore 6 で確認しましたが、object1 object2 object3 (順不同) と表示されれば成功です。