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

Natural Software

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

xsl:call-template に node-set を渡す

XML・XSL

最近 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

<?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>

結果

  • テキスト

(1)てすと
(2)てすと
(3)name
(4)id0x03bdd400
(5)name
(6)id0x03bdd5a0

  • イメージ

まとめ

これで xsl:call-template でノードセットを渡せるようになったので、いろいろコンポーネントを作るのに使えそう^^