xsl:element(その1)

今週は、来週のための準備講座で、サンプルプログラムはありません。
内容は、xsl:element という、XSLT変換の結構面倒な記述方法を紹介します。

xsl:elementの使用目的

最初に、具体例を示した方が分かりやすいと思います。
以下のようなXMLを、<td style="color:red">赤い文字</td> に変換する XSLTを想像してください。

まず、style="color:red" という属性がなければ、<td><xsl:value-of select="/data/text"/></td>ですね。
これで <td>赤い文字</td%> になります。

それなら、style="color:red" という属性がを追加するのだから
<td style="<xsl:value-of select="concat('color:', /data/color)">" ><xsl:value-of select="/data/text"/></td>で、
<td style="color:red">赤い文字</td> になりそうなものですが、これは XSLTでは 文法エラーになります。

どこが文法エラーになるかというと、<td style="<xsl:value-of select="concat('color:', /data/color)">" > の箇所で、
<td の 閉じ記号( > ) が出現する前に、別のタグが開始されている、つまり <xsl:value-of が始まっている
と文法エラーです。XMLの開始タグが入れ子になるのは禁止というわけです。

JSTL:Xタグのポイント

ちなみに、JSTL:X タグの場合は、上のような XSLTの文法エラーなんか関係ありません。
<td style="<x:out select="concat( 'color:', $xmlDom/data/color)"/>"><x:out select="$xmlDom/data/text"/></td>
でO.K.です。

XSLのポイント

XSLTでは、文法エラー回避のために、xsl:elementを使います。
まず、<td>赤い文字</td> を出力するための、xsl:element 記述を見てください。

次に、<td style="color:red">赤い文字</td> となる、記述です。

style="color:red" を出力するために、記述が1行増えましたね。
大雑把な感覚としては、xsl:element で タグの入れ物を作って、xsl:attributeで
属性を追加するといった感じでしょうか。

まとめ

今週は、XSLT変換の中でも、ちょっとマイナーな(マニアな)記法である、xsl:element を取り上げました。
タグの属性値として xsl:value-of を出力したい場合は、超裏技を使わない限り、xsl:elementを使用します。

(超裏技は xsl:text を駆使して、自分で地道に文字列をつくっていくのですが、非常に読みにくい XSL に
なるので、お勧めはできません。)

来週は、この xsl:element を使ったサンプルプログラムを作成します。
予告ですが、今週は、<td>タグを、「固定的」に xsl:element で作成しましたが、来週は
タグ名も、動的に読み込んで作成します。
読み込む XMLは、以下のような感じですね。それではまた来週。