最近 XSL もやるようになりますた。
はじめは全然わからなかったけど XSL が言語というのを理解した後は進みがはやかった。
んで、XSL で関数ぽいのが xsl:apply-templates と xsl:call-template の2つで、xsl:apply-templates は XML のノードにマッチしたものを呼び出し、xsl:call-template はよくある関数っぽく名前で呼び出せる。
それ以外に違うのは xsl:apply-templates はノードセットを渡せて、xsl:call-template はノードセットを渡せないらしい。
でもやっぱり関数っぽく使いたいし、ノードセットも渡したいので試行錯誤してみますた。
#よりよい方法や、そもそもこんなんしなくてもってコメントお待ちしてますw
とりあえず IE で動かない版。IE でも動く版は ↓
exslt:node-set() を Internet Explorer(IE)で使う - かおるんダイアリー
以下、お試し。
#注:ご使用は自己責任で^^
目的
- xsl:call-template 呼び出しの中でノードセットを使ってごにょごにょする
XML
- test.xml
<?xml version="1.0" encoding="utf-8" ?> <?xml-stylesheet href="test.xsl" type="text/xsl" ?> <root> <element> <name>てすと</name> </element> </root>
XSL
- test.xsl
<?xml version="1.0" encoding="utf-8"?> <!--node-set() は標準にはないので exslt という拡張機能(?)を利用する(IE では動かない版)--> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" exclude-result-prefixes="exslt"> <xsl:template match="/"> <HTML> <head> <title>test</title> </head> <body> <!--テンプレートの呼び出し--> <xsl:call-template name="testFunc"> <!--パラメータは xsl:copy-of で渡す--> <xsl:with-param name="node"> <xsl:copy-of select="root/element/name"/> </xsl:with-param> </xsl:call-template> </body> </HTML> </xsl:template> <!--テストテンプレート--> <xsl:template name="testFunc"> <xsl:param name ="node"/> <!--渡されたままの値を表示--> (1)<xsl:value-of select="$node" /><br/> <!--渡された値をノードセットしてから表示--> (2)<xsl:value-of select="exslt:node-set($node)/node()[1]" /><br/> <!--渡された値をノードセットに変換し、ノード名を表示--> (3)<xsl:value-of select="name(exslt:node-set($node)/node()[1])" /><br/> <!--ノードセットを引数にする generate-id を使ってみる--> (4)<xsl:value-of select="generate-id(exslt:node-set($node)/node()[1])" /><br/> <!--ノードセット名が長いので変数にする--> <xsl:variable name="nodeset" select="name(exslt:node-set($node)/node()[1])"/> <!--変数にしたノードセット名を表示する--> (5)<xsl:value-of select="$nodeset" /><br/> <!--変数にしたノードセット名からノードセットを取得、generate-id を使ってみる--> (6)<xsl:value-of select="generate-id(exslt:node-set($nodeset))" /><br/> </xsl:template> </xsl:stylesheet>
まとめ
これで xsl:call-template でノードセットを渡せるようになったので、いろいろコンポーネントを作るのに使えそう^^