<xsl:import>するライブラリを作ってみる


VisualBasicの文字列関数と互換動作するXSLT1.0準拠ライブラリ

ダウンロード

右クリックから保存を選び「xstring.xsl」というファイル名で保存してください。

概要

<xsl:import/>にてxslライブラリを読み込む利点として、
  1. 複数のxslで共通なテンプレートをまとめて1ファイルに出来る。
  2. 文字列操作など関数的な動作をするテンプレートをこさえておき、そのxslをimportすることで、関数的な動作を使用することが出来るようにする。
というのが考えられます。

(1)の場合、外部xslは
<xsl:template match="***">
という、特定のノードにマッチした場合のテンプレートの集合になりますが、

(2)の場合外部xslは
<xsl:template name="***">
の集合になり、
読込元のxslからは、
<xsl:call-template>
にてその機能を呼び出すことになります。

今回は(2)に該当するテンプレートの集合にてVisualBasicのいくつかの文字列関数と同等の機能をXSLT1.0準拠にて実装してみました。
の機能を実験的に実装してみました。
(Left/RightはXPath関数のsubstringがあるので意味無いですが、実験と言うことでとりあえず実装)


尚、返ってきた値をそのまま出力するのではなく、別の箇所で使用するには、

<xsl:variable name="rev"> <xsl:call-template name="xstring-reverse"> <xsl:with-param name="str" select="'abcdefg'"/> </xsl:call-template> </xsl:variable>
の様に、<xsl:call-template>の外側を<xsl:variable>で囲み、一旦変数に入れてから使用することになりますが、XSLT2.0では<xsl:function>というものが提案されており、これの実装次第では、このような冗長な記述をする必要が無くなりそうです。
(その場合、インポートライブラリは<xsl:template>の集合ではなく、<xsl:function>の集合になると思われます。)

使用例

VBのInStrRev関数(文字列を右側から見て、比較文字列がマッチする位置を返す)同等の機能を使用して、フルパス名からファイル名のみを取り出す使用例です。

[xml文書]
<path>/www/document/folder/fileneme.ext</path>

[xsl文書]
<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="xstring.xsl" /> <xsl:template match="/"> <xsl:variable name="slash"><!-- /の位置 --> <xsl:call-template name="xstring-instrrev"> <xsl:with-param name="str" select="path" /> <xsl:with-param name="match" select="'/'" /> </xsl:call-template> </xsl:variable> <filename> <xsl:value-of select="substring(path , $slash + 1)" /> </filename> </xsl:template> </xsl:stylesheet>

[出力結果]
<filename>fileneme.ext</filename>


戻る