XSLT2.0で便利になった機能(9) for式を使う

for式もXPath2.0から導入されたものです.ところが、自分のスタイルシートを見渡してもforを使っているところは一箇所しかありませんでした.紹介しますと索引のソートキーを作成するのにどうしても固定長のスペースの文字列が必要でした.
 
最初はこれを
 
<xsl:variable name="space256" select="'                                                                                                                                                                                                                                                                '"/>
 
なんてバカ正直に書いていたのですが、forを思い出し
 
<xsl:variable name="cIndexSortKeyMaxLen" as="xs:integer" select="256"/>
<xsl:variable name="paddingSpace" as="xs:string" select="string-join(for $i in 1 to $cIndexSortKeyMaxLen return ' ','')"/>
 
と書き直しました.あまり面白くない例ではありますが動いています.しかしfor式は、本質的には、sequenceからsequenceへの変換が役割です.Michael Kayの本では、抽象的に
 
for $x in $SEQ return F($x)
 
と説明されています.これではsequenceの$seqに対して個々のF($x)をsequenceにまとめて返して返してくれるということを言ってます.すなわち、for式はF()というフィルターをsequenceに適用する機構ではないかと思います.
簡単な例では、以下のようなものがあります.
 
for $x in ("red","blue","green") return string-length($x)
 
は、(3,4,5)というsequenceを返してくれるでしょう.しかし、残念ながら私の携わっているスタイルシートでは、現在のところ本質にかなった使い道がないようです.
 
手元に日経BPの「XQuery+XMLデータベース入門」という本がありますが、これにはFLOWR形式といって、forが大活躍です.
 
for $p in collection("product.xml")/product
let $pprice=xs:decimal($p/description/price)
ordered by $pprice ascending
return ($p//name,$p//price)
 
こちらはfor文ですが、こちらの分野の方が得意なのでしょう.