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>