<xsl:import>するライブラリを作ってみる
VisualBasicの文字列関数と互換動作するXSLT1.0準拠ライブラリ
ダウンロード
右クリックから保存を選び「xstring.xsl」というファイル名で保存してください。
- xstring.xsl [ver1.00](2003/07/05)
ダウンロード(約5kbyte)
概要
<xsl:import/>にてxslライブラリを読み込む利点として、
- 複数のxslで共通なテンプレートをまとめて1ファイルに出来る。
- 文字列操作など関数的な動作をするテンプレートをこさえておき、そのxslをimportすることで、関数的な動作を使用することが出来るようにする。
というのが考えられます。
(1)の場合、外部xslは
<xsl:template match="***">
という、特定のノードにマッチした場合のテンプレートの集合になりますが、
(2)の場合外部xslは
<xsl:template name="***">
の集合になり、
読込元のxslからは、
<xsl:call-template>
にてその機能を呼び出すことになります。
今回は(2)に該当するテンプレートの集合にてVisualBasicのいくつかの文字列関数と同等の機能をXSLT1.0準拠にて実装してみました。
- Reverse(StrReverse):文字列を反転
- Left :文字列の左n文字を取得
- Right :文字列の右n文字を取得
- InStr :(先頭から検索して)検索文字が存在する位置を取得
- InStrRev :(末尾から検索して)検索文字が存在する位置を取得
- Ucase :大文字に変換
- Lcase :小文字に変換
- Replace :文字列の置き換え
の機能を実験的に実装してみました。
(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>
戻る