- PR -

XSLT、call-templateでのnode-set値パラメータの引渡し方法

1
投稿者投稿内容
KRD
会議室デビュー日: 2006/03/07
投稿数: 6
投稿日時: 2006-03-07 19:12
XML初学者です。相談させてください。
「call-template」でのパラメータの引渡しについて、node-setを引き渡す方法が分かりません。
下記のXSLTスタイルシートで、Text値の引渡し(※1)は成功するのですが、node-setを引渡したい部分(※2)が成功していないようで、node-set値の参照(※3)でエラーとなってしまいます。
node-setの引渡しは、どのように記述したらいいのでしょうか?

----- 呼び出し部分 -------------------------------
<xsl:template match="dataset">
<xsl:for-each select="./data">
<xsl:call-template name="convert">
<xsl:with-param name="vname"> ┐
<xsl:value-of select="./name"/> │※1.Text値
</xsl:with-param> ┘
<xsl:with-param name="vvalue"> ┐
<xsl:copy-of select="./value"/> │※2.node-set
</xsl:with-param> ┘
</xsl:call-template>
</xsl:for-each>
</xsl:template>

----- 呼び出されるテンプレート -------------------
<xsl:template name="convert">
<xsl:param name="vname"/>
<xsl:param name="vvalue"/>
<xsl:if test="$vname='ObjectName'">
<value>
<xsl:attribute name="id">$vname</xsl:attribute>
<xsl:value-of select="$vvalue/V"/> ←※3.エラー箇所
</value>
</xsl:if>
<xsl:if test="$vname='MaterialList'">
<value>
<xsl:attribute name="id">$vname</xsl:attribute>
<xsl:for-each select="$vvalue/V/V">
<Mtl><xsl:value-of select="."/></Mtl>
</xsl:for-each>
</value>
</xsl:if>
</xsl:template>

----- 変換元XMLファイル --------------------------
<?xml version="1.0" encoding="utf-8"?>
<dataset>
<data>
<name>ObjectName</name>
<value>
<V>JOB-10</V>
</value>
</data>
<data>
<name>MaterialList</name>
<value>
<V>
<V>Mtl-201</V>
<V>Mtl-202</V>
<V>Mtl-203</V>
</V>
</value>
</data>
</dataset>
ゆう
常連さん
会議室デビュー日: 2003/06/27
投稿数: 45
投稿日時: 2006-03-07 19:37
 Google検索結果の「USERS GROUP : [XML:01451] Re: ノード名の変数代入」に
情報があるようです。
(通常のリンクからは行けないようなので、キャッシュを読んでみてください)

Google検索結果 キーワード「xslt ノードリストへ評価」
http://www.google.co.jp/search?q=xslt+%E3%83%8E%E3%83%BC%E3%83%89+%E3%83%AA%E3%82%B9%E3%83%88%E3%81%B8%E8%A9%95%E4%BE%A1&start=0&hl=ja&lr=lang_ja&ie=utf-8&oe=utf-8&client=firefox&rls=org.mozilla:ja:official


[ メッセージ編集済み 編集者: 悠 編集日時 2006-03-07 19:51 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-03-08 11:09
XMLSpy内蔵の XSLTエンジンで xslt2.0 の指定では、何か動きます


<value xmlns:fn="http://www.w3.org/2004/10/xpath-functions" xmlns:xdt="http://www.w3.org/2004/10/xpath-datatypes" xmlns:xs="http://www.w3.org/2001/XMLSchema" id="$vname">JOB-10</value>
<value xmlns:fn="http://www.w3.org/2004/10/xpath-functions" xmlns:xdt="http://www.w3.org/2004/10/xpath-datatypes" xmlns:xs="http://www.w3.org/2001/XMLSchema" id="$vname">
<Mtl>Mtl-201</Mtl>
<Mtl>Mtl-202</Mtl>
<Mtl>Mtl-203</Mtl>
</value>
=============
xslt2.0発行直前ですから、メジャーなxsltプロセッサは 実装入っています
(簡単な部分は使えるかも、+自己責任)
========================
簡単な解決(ソリューションと言い替ええてもいい)のポイントは
「カレントノード」
の意識です、./ が付いたパラメータを渡すのはオカシイ
呼び出された側のカレントは呼び出した側のが、「引き継がれます」
従って、パラメータは全く不要です。
$変数の部分を ./name や ./value に書き換えるだけ、行数も減る。

[ メッセージ編集済み 編集者: MMX 編集日時 2006-03-08 11:29 ]
KRD
会議室デビュー日: 2006/03/07
投稿数: 6
投稿日時: 2006-03-08 16:47
ご回答ありがとうございました。参考にさせていただきます。
1

スキルアップ/キャリアアップ(JOB@IT)