XML文書の一部分を指定 - XPath
テンプレート適用先をselect属性で指定していますが、
その書き方はXPathという仕様に基づいています。
相対位置指定
- .
- カレントノード
- 要素名A
- カレントノードの子要素である要素A
- 要素名A/要素名B
- その要素Aの子要素である要素B
- 要素名A//要素名C
- カレントノードの子要素である要素Aの子孫要素C
- 要素名A/@属性名D
- カレントノードの子要素である要素Aの属性D
"festivals"は、この場合のカレントノード"/"の子要素になります。
絶対位置指定
- /
- ルートノード
- /要素名A
- ルート要素A
- /要素名A/要素名B
- ルート要素Aの子要素である要素B
- //要素名C
- 文書内のすべての要素C
- /要素名A/要素名B/@属性D
- ルート要素Aの子要素である要素Bの属性D
カレントノードが"/"の場合の"festivals"は、"/festivals"とも書けるわけです。
ディレクトリの相対/絶対パスと同じ話です。
条件によるノードの絞り込み
XPathでは、条件を付加することによりマッチする要素を絞り込むことができます。
それをうまく使うと、XSLT のプログラムをスマートに記述することができます。
- XPathの式の後に[n]をつけて、n番目の要素だけを指定することができます。例えば "festival[2]" とすれば2番目の festival を表します。
- 演算子を使った絞り込みもできます。"festival[bands/band='Bjork']" とすると、festivalから見た bands/band 要素が Bjork の場合だけマッチします。
なお、「=」は比較の演算子です。代入ではありません。
- 属性を指定することもできます。"band[@vocal='female']" とすると、band 要素で vocal="female" という属性の指定があるもののみマッチします。
- 用意された関数を使って条件をつけることができます。"band[starts-with(.,'T')]" とすると、band 要素で、その要素の内容(.)が'T'で始まっているもののみマッチします。contains(band,'The') とすれば、子要素 band が 'The' を含んでいるときに true になります。
- 条件は論理式なので and や or で結合することができます。
名前空間接頭辞の扱い (参考)
変換対象の要素などが「artist:name」のように名前空間接頭辞つきの場合、
そのまま「接頭辞:名前」の形式で記述します。
そのため、接頭辞の定義である xmlns:接頭辞="~" を、
xsl:stylesheet 要素の属性として記述しておく必要があります
(変換対象のXML文書からコピーしてくればよいでしょう)。
データの取り出し (復習)
value-of や copy-of の対象を指定するために select 要素で選択しますが、
この select 要素の値は XPath です。
テキストの取り出し
XPathで指定したノード以下からテキストを取り出すことができます。
<xsl:value-of select="式"/>
要素の取り出し
XPathで指定したノード以下のすべてを出力文書にコピーすることができます。
<xsl:copy-of select="式"/>
演習
これまで作成してきたXSLTファイルを、複数テンプレートを使うものに書き換えてみましょう。
複数存在する要素に対して apply-templates を行うことにより、
これまでできなかった繰り返し処理が可能になります。