XSLT : してログ

12

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"/>

[XSLT] 空要素の判定

XSLT 20121231

空要素でない場合を判断するには、下記のようにします。空要素の場合を判断するには、「!=」を「=」に置き換えればできます。

<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 では、&nbsp; で空白文字を挿入できるが、XSLT でこれを挿入したいときはどうしたらいいか。このようなときは、disable-output-escaping="yes" として &nbsp; と記述することで回避可能です。

<xsl:text disable-output-escaping="yes">&amp;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>

演算は、変数と演算子のスペースを開けてください。スペースを開けない場合は、エラーになることがあります。

下記は、演算を使って、SVG を出力する例です。
<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 &gt; $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>

HTML では、タグで囲まれた以外のところに文字を挿入できたりしますが、XSTL(XML)では、これは許されません。そこで、XSLT には、<xsl:text> がありますので、これで囲んであげます。

<xsl:text>ここに文字列を書く</xsl:text>

または、HTML の <span> タグで囲んでもよいでしょう。

12