文字列値


次の例文のコンテキストノードの最初の位置は artist とします。

cd//track[3]

cd 部分の意味は「コンテキストノード artist の子要素である cd を選択する」となります。"//track[3]" の部分を解釈する際のコンテキストノードは cd ですからこの部分の意味は「コンテキストノード cd の子孫ノードのうち 3 番目の track 要素を選択する」となります。兄弟要素の順番ですが、XML 文書内での出現順に 1, 2, 3, ... となります。

<trackListings>
  <track no="1">Soon</track> ・・・・・・・1番目
  <track no="2">Glider</track> ・・・・・・2番目
  <track no="3">Don't Ask Why</track>・・・3番目
  <track no="4">Off Your Face</track>・・・4番目
</trackListings>

また、このロケーションパス式を XSLT を用いて出力した結果は、"Don't Ask Why" となりますが、これはテキストノードの値ですので本来は、"cd//track[3]/text()" と記述しなければいけないはずです。なぜこのような結果となるのでしょうか。ここで、問題となるのは「文字列値」と呼ばれる値です。要素ノードの文字列値とは、その要素の子孫として存在するすべてのテキストノードの文字データを連結した値となります。

具体例を挙げると、要素ノード trackListings の文字列値は "Soon Glider Don't Ask Why Off Your Face" となり、属性ノード no の値が 1 である要素ノード track の文字列値は "Soon" となります。

上記の理由から、"cd//track[3]" と指定した場合と "cd//track[3]/text()" と指定した場合のロケーションパス式の評価値が同じになります。