XSLT2.0で便利になった機能(57) Xpathのコメント

XSLTというよりは、XPathの話なのですが、この前DITA-OTのxslフォルダのスタイルシートを見ていたら次のようなコードが出てきました.

<xsl:if test="(:not(@linking) and :)not($parent-linking='none')">

あまり見慣れていない"(:"と":)"という表記があります.これは何かというと実はXPathの中に書けるコメントです.

エッ!ホントなのか?と思われる方もいらっしゃるでしょうが、確かにXPathの仕様にちゃんと書いてあります.

2.6 Comments

何故このような表記になってしまったのでしょうか?CやC++では1行のコメントの"//"や"/*"と"*/"で囲むコメントが使われます.Pascalは"(*"と"*)"で囲むコメントが使われます.でもXPathでは、"//"も"*"もとても大事な意味を持っていますよね.なので混乱を防ぐために行き着いた先が"(:"と":)"だったのでしょう.

では、実際どのような時につかうのでしょうか?自分で身に染みて感じるのは次のような場合です.

- 最初は簡単だと思ってXPathを書く、けれどもうまく動いてくれない.
- あの条件もあった、この条件もあったとどんどんXpathが肥大化してゆく.
- で、何回も削ったり付け加えたりして、やっと目的のXpath式に行き着く.

この過程で、"削ったり付け加えたりして"というときに、コメントが使えると非常に便利なのです.トライアンドエラーでやっているとき、いちいち前のコードを全部消さないとダメなのは結構大変です."(:"と":)"で囲めば消さずに済むのでとても楽なのです.

でも最終的にあまり長いXPath式はxsl:functionに置き換えるのが良いと思います.その方がはるかに可読性は向上するからです.ここへたどり着くまでのデバッグの過程でXPath式のコメントは非常に役にたつでしょう.

以下の例は"element"という綴りがあるテキストノードを拾っていますが、//text()[contains(. (: commnet :), 'element')]と書いてちゃんと動きます.

イメージ 1