ends-withがない

今週は、XPathの関数で、ens-withがないという問題の回避方法を考えます。
XPathの関数には、なぜか starts-with() と contains() があるのに、ends-with() が
ありません。

例えば、下のようなファイル名を列挙した XML で、拡張子が jpg のものだけを取り出したい
とした場合に、よくこの問題にぶち当たります。

とりあえずは、/files/name[ contains(., '.jpg') ] を試してみると、結果は以下の通り

/files/name[ contains(., '.jpg') ]の結果

残念ながら、拡張子が、「.jpg.bak」のファイルも含まれてしまいました。

なんとかする

ここから先は、あまりエレガントな方法ではありません。
とにかく、チカラ技で、「.jpg.bak」を排除します。

ポイントは、substring-after() 関数で、「.jpg」の後ろの文字列を取り出します。

  1. 「.jpg」で終わっている = substring-after()に失敗する = 戻り値が false
  2. 「.jpg」の続きがある = substring-after()に成功する = 戻り値が true

なので、XPathは、以下のように記述します。

結果は、なんとか意図どおりに、「.jpg」で終わる <name>だけが残ったようです。

まとめ

XPathのends-withを補完するための試みを行いました。
管理人としては、ends-with補完よりも、substring-after()のエラーの挙動が分かったほうが
勉強になる話題となりました。