読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

exslt:node-set() を Internet Explorer(IE)で使う

XML・XSL

xsl:call-template に node-set を渡す - かおるんダイアリー
このやり方では実は Firefox 3.0、Google Chrome 1.0、Safari 4(Public Beta) で動くけど IE(7,8)では動かなかったり。


あらあらと思ったらちゃんと解決法がありますたので、これを入れて試してみる。


以下、お試し。
#注:ご使用は自己責任で^^

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>

結果

警告が出たあと。。。

あれ? (6) だけ出ない。。。

ただし

これをやると Visual Studioデバッグができなくなった。
解決方法はわからん・・・