要素の存在を判断する
<xsl:if test="要素名">
AまたはB
<xsl:if test="A or B">
AかつB
<xsl:if test="A and B">
<xsl:if test="要素名">
<xsl:if test="A or B">
<xsl:if test="A and B">
HTML タグをデータとして持っている XML から、HTML を生成する場合は、エスケープ処理を無効にしておかないと、期待した結果になりません。例えば、データベースの BLOB テキストフィールド格納された、改行付きのテキストの、改行コードを <br/> に置き換えて処理したいことがありますが、このようなときに有効です。
<xsl:value-of select="data" disable-output-escaping="yes"/>
※XML の方は、<![CDATA[ ... ]]> を使って用意してください。
※<xsl:apply-templates select="data" disable-output-escaping="yes"/> と書くことはできません。もっとも、テンプレートを適用しない場合、<xsl:value-of> を使う方が、可読性が高くなると思います。
XHTML も XML には変わりないので、下記のように、method を "xml" と指定して出力させます。html として出力すると、終了タグを持たない <br> などは、<br/> や <br></br> と書いても、閉じタグは消されてしまいます。
<xsl:output method="xml" encoding="utf-8"/>
また、出力結果を XHTML の一部としてマージしたいような場合、XML 宣言が邪魔な場合は、下記のように omit-xml-declaration を指定して省略させることができます。
<xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes"/>
空要素でない場合を判断するには、下記のようにします。空要素の場合を判断するには、「!=」を「=」に置き換えればできます。
<xsl:if test="name[.!='']"> <xsl:text>name は空ではありません</xsl:text> </xsl:if>
下記のように書くこともできます。
<xsl:if text="string-length(data)=0"> <xsl:text>data は空文字です</xsl:text> </xsl:if>
HTML では、 で空白文字を挿入できるが、XSLT でこれを挿入したいときはどうしたらいいか。このようなときは、disable-output-escaping="yes" として と記述することで回避可能です。
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
次の例では、カレント要素の属性をすべて列挙し、テーブルに加工する例です。
<table> <tr> <th>項目</th><th>値</th> </tr> <xsl:for-each select="@*"> <tr> <td><xsl:value-of select="name(.)"/></td> <td><xsl:value-of select="."/></td> </tr> </xsl:for-each> </table>
演算は、変数と演算子のスペースを開けてください。スペースを開けない場合は、エラーになることがあります。
<line x1="{$l_mergin}" y1="{$y_size - $b_mergin}" x2="{$l_mergin}" y2="{$t_mergin}" stroke="black" stroke-width="1"/>
Ver 1 では、再帰呼び出しのテンプレートを使うしかないです。下記のようにしてみてください。
<xsl:template name="sample"> <xsl:param name="end"/> <xsl:param name="i"/> <xsl:if test="$end > $i"> <!-- 繰り返したい処理をここに記す --> <xsl:call-template name="sample"> <xsl:with-param name="end" select="$end"/> <xsl:with-param name="i" select="$i + 1"/> </xsl:call-template> </xsl:if> </xsl:template>
Ver 2 では、下記のように集合を指定することで、任意の回数のループを組むことができます。
<xsl:for-each select="(1 to 5)"> <xsl:text>{.} 回目の処理です。</xsl:text> </xsl:for-each>
終了タグのスラッシュと衝突しますので、「/」は演算記号として使用できません。代わりに、div を記述します。
<xsl:variable name="x" select="1 div 3"/>
HTML では、タグで囲まれた以外のところに文字を挿入できたりしますが、XSTL(XML)では、これは許されません。そこで、XSLT には、<xsl:text> がありますので、これで囲んであげます。
<xsl:text>ここに文字列を書く</xsl:text>
または、HTML の <span> タグで囲んでもよいでしょう。