xsl:call-template に node-set を渡す - かおるんダイアリー
このやり方では実は Firefox 3.0、Google Chrome 1.0、Safari 4(Public Beta) で動くけど IE(7,8)では動かなかったり。
あらあらと思ったらちゃんと解決法がありますたので、これを入れて試してみる。
以下、お試し。
#注:ご使用は自己責任で^^
XML
- test2.xml
<?xml version="1.0" encoding="utf-8" ?> <?xml-stylesheet href="test2.xsl" type="text/xsl" ?> <root> <element> <name>てすと</name> </element> </root>
XSL
- test2.xsl
<?xml version="1.0" encoding="utf-8"?> <!--node-set() は標準にはないので exslt という拡張機能(?)を利用する(IE でも動く版)--> <!-- Smart trick - exslt:node-set() in Internet Explorer http://www.tkachenko.com/blog/archives/000704.html --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="exslt msxsl"> <msxsl:script language="JScript" implements-prefix="exslt"> this['node-set'] = function (x) { return x; } </msxsl:script> <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>
ただし
これをやると Visual Studio のデバッグができなくなった。
解決方法はわからん・・・