XPathで忘れがちなこと
あるいは、知らなかったこと。よくXMLマスター:プロフェッショナル(アプリケーション開発)受かったな。
パス式内での()
の使用
うわー。使ったことない。やばい。
data1.xml
<abc> <x>1</x> <x>2</x> <def> <x>3</x> <x>4</x> <x>5</x> <x>6</x> </def> <x>7</x> <x>8</x> <def> <x>9</x> <x>10</x> </def> </abc>
chap3-08.xq
fn:doc("data1.xml")/abc/(def/x)[5]
結果
<x>9</x>
()
がないと、
fn:doc("data1.xml")/abc/def/x[5]
def要素の子に5個もx要素ないから当然何も返ってこないんだけど、()
使うとdef要素がユニオンされてる。というわけで、仮想的にはデータモデルがこう扱われる。シーケンスはドキュメント出現順だ。
<def> <x>3</x> <x>4</x> <x>5</x> <x>6</x> <x>9</x> <x>10</x> </def>
よって、5番目のx要素が返るため、結果は、
<x>9</x>
と。きもいけど、便利だ。
chap3-09.xq
fn:doc("data1.xml")/abc/(//x)[fn:last()]
結果
<x>10</x>